From 0e859cb230082d5a8589454fbdbd42a41001f830 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 9 Sep 2025 16:41:22 +0300 Subject: [PATCH 01/75] Set Design Requires Compatibility for iOS 26 to true --- ZShare/Info.plist | 2 ++ Zotero/Info.plist | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ZShare/Info.plist b/ZShare/Info.plist index e851d7787..52e6d1593 100644 --- a/ZShare/Info.plist +++ b/ZShare/Info.plist @@ -54,5 +54,7 @@ NSMicrophoneUsageDescription Access to microphone + UIDesignRequiresCompatibility + diff --git a/Zotero/Info.plist b/Zotero/Info.plist index ecd4d9c56..96fd987d6 100644 --- a/Zotero/Info.plist +++ b/Zotero/Info.plist @@ -108,6 +108,8 @@ audio + UIDesignRequiresCompatibility + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities From 7c44b0736f98077dd15d2aa05c0dc8f734e99ee3 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 11 Sep 2025 00:15:15 +0300 Subject: [PATCH 02/75] Update icon for iOS 26 --- Zotero.xcodeproj/project.pbxproj | 7 + .../AppIcon.icon/Assets/Artboard 1 12.svg | 4 + .../AppIcon.icon/Assets/Artboard 1 14.svg | 4 + .../AppIcon.icon/Assets/Artboard 1 18.svg | 10 + Zotero/Assets/AppIcon.icon/Assets/dark 3.svg | 87 ++++ Zotero/Assets/AppIcon.icon/Assets/dark 5.svg | 10 + Zotero/Assets/AppIcon.icon/Assets/dark.svg | 89 ++++ .../Assets/AppIcon.icon/Assets/default 4.svg | 28 ++ Zotero/Assets/AppIcon.icon/icon.json | 396 ++++++++++++++++++ 9 files changed, 635 insertions(+) create mode 100644 Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/Artboard 1 14.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/Artboard 1 18.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/dark 3.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/dark 5.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/dark.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/default 4.svg create mode 100644 Zotero/Assets/AppIcon.icon/icon.json diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 6f02aa102..178db159a 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -64,6 +64,7 @@ 618404262A4456A9005AAF22 /* IdentifierLookupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618404252A4456A9005AAF22 /* IdentifierLookupController.swift */; }; 618D83E72BAAC88C00E7966B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 618D83E62BAAC88C00E7966B /* PrivacyInfo.xcprivacy */; }; 618D83E82BAAC88C00E7966B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 618D83E62BAAC88C00E7966B /* PrivacyInfo.xcprivacy */; }; + 61933F242E7218B500F4547F /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 61933F232E7218B500F4547F /* AppIcon.icon */; }; 61A0C8472B8F669C0048FF92 /* PSPDFKitUI+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A0C8462B8F669B0048FF92 /* PSPDFKitUI+Extensions.swift */; }; 61ABA7512A6137D1002A4219 /* ShareableImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61ABA7502A6137D1002A4219 /* ShareableImage.swift */; }; 61AD977D2D67F42A000FDF45 /* PDFWorkerControllerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AD977C2D67F42A000FDF45 /* PDFWorkerControllerSpec.swift */; }; @@ -1364,6 +1365,7 @@ 617999712D8089200051D35E /* RenameAttachmentFilenameDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenameAttachmentFilenameDbRequest.swift; sourceTree = ""; }; 618404252A4456A9005AAF22 /* IdentifierLookupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentifierLookupController.swift; sourceTree = ""; }; 618D83E62BAAC88C00E7966B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + 61933F232E7218B500F4547F /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = ""; }; 61A0C8462B8F669B0048FF92 /* PSPDFKitUI+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PSPDFKitUI+Extensions.swift"; sourceTree = ""; }; 61ABA7502A6137D1002A4219 /* ShareableImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareableImage.swift; sourceTree = ""; }; 61AD977C2D67F42A000FDF45 /* PDFWorkerControllerSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFWorkerControllerSpec.swift; sourceTree = ""; }; @@ -2369,6 +2371,7 @@ B30563AD23FC051D003304F2 /* Assets */ = { isa = PBXGroup; children = ( + 61933F232E7218B500F4547F /* AppIcon.icon */, B305643323FC051E003304F2 /* Assets.xcassets */, B30B550224B85A3A00F94B59 /* Colors.xcassets */, B30B550424B85A6200F94B59 /* Images.xcassets */, @@ -4668,6 +4671,7 @@ 613F32792C1086960088EF70 /* InfoPlist.strings in Resources */, B361820324C9A7C000B30D56 /* OnboardingViewController.xib in Resources */, B361820424C9A7C000B30D56 /* OnboardingPageView.xib in Resources */, + 61933F242E7218B500F4547F /* AppIcon.icon in Resources */, B3F0C3FA250A1BD8002D557A /* LibrariesViewController.xib in Resources */, B3E8FE1D2714297200F51458 /* CiteSearchViewController.xib in Resources */, B3B398532E4CCB20009C59F5 /* DocumentSearchCell.xib in Resources */, @@ -6368,6 +6372,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Zotero/Zotero.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -6407,6 +6412,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Zotero/Zotero.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -6690,6 +6696,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Zotero/Zotero.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; diff --git a/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg new file mode 100644 index 000000000..11db3a08f --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 14.svg b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 14.svg new file mode 100644 index 000000000..9e1ebfb56 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 14.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 18.svg b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 18.svg new file mode 100644 index 000000000..d18dd8313 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 18.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/dark 3.svg b/Zotero/Assets/AppIcon.icon/Assets/dark 3.svg new file mode 100644 index 000000000..e73bc8c17 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/dark 3.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/dark 5.svg b/Zotero/Assets/AppIcon.icon/Assets/dark 5.svg new file mode 100644 index 000000000..946cae0c9 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/dark 5.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/dark.svg b/Zotero/Assets/AppIcon.icon/Assets/dark.svg new file mode 100644 index 000000000..62064c61d --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/dark.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/default 4.svg b/Zotero/Assets/AppIcon.icon/Assets/default 4.svg new file mode 100644 index 000000000..13aa4ae06 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/default 4.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/icon.json b/Zotero/Assets/AppIcon.icon/icon.json new file mode 100644 index 000000000..b5dde1ca7 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/icon.json @@ -0,0 +1,396 @@ +{ + "fill-specializations" : [ + { + "value" : "system-light" + }, + { + "appearance" : "dark", + "value" : "system-dark" + } + ], + "groups" : [ + { + "blur-material-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "dark", + "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 1 + } + ], + "hidden" : false, + "layers" : [ + { + "blend-mode" : "normal", + "fill-specializations" : [ + { + "value" : { + "solid" : "srgb:0.76078,0.76078,0.76078,1.00000" + } + }, + { + "appearance" : "dark", + "value" : { + "solid" : "srgb:1.00000,1.00000,1.00000,1.00000" + } + }, + { + "appearance" : "tinted", + "value" : { + "solid" : "srgb:1.00000,1.00000,1.00000,1.00000" + } + } + ], + "glass-specializations" : [ + { + "value" : true + }, + { + "appearance" : "tinted", + "value" : true + } + ], + "hidden" : false, + "image-name" : "Artboard 1 14.svg", + "name" : "dog-ear", + "opacity-specializations" : [ + { + "value" : 0.5 + }, + { + "appearance" : "dark", + "value" : 0.16 + }, + { + "appearance" : "tinted", + "value" : 0.35 + } + ] + } + ], + "name" : "Group", + "opacity-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "dark", + "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 1 + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 0 + ] + }, + "shadow" : { + "kind" : "neutral", + "opacity" : 1 + }, + "specular" : true, + "translucency-specializations" : [ + { + "value" : { + "enabled" : true, + "value" : 1 + } + }, + { + "appearance" : "dark", + "value" : { + "enabled" : true, + "value" : 1 + } + }, + { + "appearance" : "tinted", + "value" : { + "enabled" : true, + "value" : 1 + } + } + ] + }, + { + "hidden" : false, + "layers" : [ + { + "fill-specializations" : [ + { + "appearance" : "dark", + "value" : "none" + }, + { + "appearance" : "tinted", + "value" : { + "solid" : "srgb:1.00000,1.00000,1.00000,1.00000" + } + } + ], + "glass-specializations" : [ + { + "value" : true + }, + { + "appearance" : "dark", + "value" : true + } + ], + "hidden-specializations" : [ + { + "value" : false + }, + { + "appearance" : "dark", + "value" : true + } + ], + "image-name" : "Artboard 1 18.svg", + "name" : "z-default", + "opacity" : 1 + }, + { + "hidden-specializations" : [ + { + "value" : false + }, + { + "appearance" : "light", + "value" : true + }, + { + "appearance" : "tinted", + "value" : true + } + ], + "image-name" : "dark 5.svg", + "name" : "z-dark" + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "srgb:1.00000,1.00000,1.00000,1.00000" + } + } + ], + "hidden" : false, + "image-name" : "default 4.svg", + "name" : "sticky-notes", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.8 + } + ] + } + ], + "opacity" : 1, + "shadow-specializations" : [ + { + "value" : { + "kind" : "layer-color", + "opacity" : 0.5 + } + }, + { + "appearance" : "dark", + "value" : { + "kind" : "layer-color", + "opacity" : 0.5 + } + } + ], + "specular" : true, + "translucency-specializations" : [ + { + "value" : { + "enabled" : false, + "value" : 0.5 + } + }, + { + "appearance" : "dark", + "value" : { + "enabled" : true, + "value" : 0.4 + } + }, + { + "appearance" : "tinted", + "value" : { + "enabled" : true, + "value" : 0.4 + } + } + ] + }, + { + "blur-material-specializations" : [ + { + "value" : 0.5 + }, + { + "appearance" : "dark", + "value" : 0.5 + }, + { + "appearance" : "tinted", + "value" : 0.5 + } + ], + "hidden" : false, + "layers" : [ + { + "fill-specializations" : [ + { + "appearance" : "dark", + "value" : "none" + } + ], + "hidden" : false, + "image-name" : "Artboard 1 12.svg", + "name" : "cover", + "opacity-specializations" : [ + { + "appearance" : "dark", + "value" : 0 + }, + { + "appearance" : "tinted", + "value" : 0 + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ], + "name" : "Group", + "opacity-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "dark", + "value" : 1 + } + ], + "shadow-specializations" : [ + { + "value" : { + "kind" : "neutral", + "opacity" : 0.5 + } + }, + { + "appearance" : "dark", + "value" : { + "kind" : "neutral", + "opacity" : 1 + } + } + ], + "specular-specializations" : [ + { + "appearance" : "dark", + "value" : true + } + ], + "translucency-specializations" : [ + { + "value" : { + "enabled" : true, + "value" : 0.7 + } + }, + { + "appearance" : "dark", + "value" : { + "enabled" : true, + "value" : 1 + } + }, + { + "appearance" : "tinted", + "value" : { + "enabled" : true, + "value" : 0.4 + } + } + ] + }, + { + "layers" : [ + { + "hidden-specializations" : [ + { + "value" : true + }, + { + "appearance" : "light", + "value" : false + }, + { + "appearance" : "dark", + "value" : true + } + ], + "image-name" : "dark.svg", + "name" : "highlight-default", + "opacity-specializations" : [ + { + "appearance" : "dark", + "value" : 1 + } + ] + }, + { + "hidden-specializations" : [ + { + "value" : false + }, + { + "appearance" : "light", + "value" : true + } + ], + "image-name" : "dark 3.svg", + "name" : "highlight-dark" + } + ], + "name" : "Group", + "shadow" : { + "kind" : "layer-color", + "opacity" : 0.5 + }, + "specular" : false, + "translucency" : { + "enabled" : false, + "value" : 0 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file From 79fff4a85b0e55afcf8d5e1cf5350b56f646c05c Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 11 Sep 2025 09:20:50 +0300 Subject: [PATCH 03/75] Preserve old icon in iOS versions older than 26 --- Zotero.xcodeproj/project.pbxproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 178db159a..a962f1ae0 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -6245,6 +6245,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -6311,6 +6312,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -6630,6 +6632,7 @@ baseConfigurationReference = 615645502DE0825900B8AA6D /* FeatureGates.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; From 24bcb6eda0e05d33f3d5f0817d89e1c661c80e63 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 10 Sep 2025 12:00:11 +0300 Subject: [PATCH 04/75] Add separate beta argument for triggering beta Xcode cloud workflow --- ci_scripts/ci_post_clone.sh | 8 ++++++-- scripts/push_build | 32 ++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/ci_scripts/ci_post_clone.sh b/ci_scripts/ci_post_clone.sh index 76f8e67dd..d91704795 100755 --- a/ci_scripts/ci_post_clone.sh +++ b/ci_scripts/ci_post_clone.sh @@ -58,8 +58,12 @@ bump_version() { echo "${version_parts[0]}.${version_parts[1]}.${version_parts[2]}" } -# Extract version bump -case "$(echo "$CI_TAG" | sed -n 's/^trigger-build-bump-\(.*\)-date-.*$/\1/p')" in +# Extract version bump from either trigger-build or trigger-beta-build tags +version_bump_part="" +if [[ "$CI_TAG" =~ ^trigger-(beta-)?build-bump-(.*)-date-.*$ ]]; then + version_bump_part="${BASH_REMATCH[2]}" +fi +case "$version_bump_part" in "patch") newVersionString=$(bump_version "$versionString" "patch") ;; diff --git a/scripts/push_build b/scripts/push_build index 89b91bfdb..36d43bc85 100755 --- a/scripts/push_build +++ b/scripts/push_build @@ -16,23 +16,39 @@ TAG_BUMP="bump" DEFAULT_TAG_BUMP="patch" DEFAULT_TAG="$TAG_START-$TAG_BUMP-$DEFAULT_TAG_BUMP" -# Positional arguments: -# $1 = bump [patch (default)|minor|major] +# Parse arguments +BETA_BUILD=false +VERSION_BUMP="" -if [ $# -eq 0 ]; then - TAG=$DEFAULT_TAG -else +while [[ $# -gt 0 ]]; do case $1 in - "minor"|"major"|"patch") - TAG="$TAG_START-$TAG_BUMP-$1" + --beta) + BETA_BUILD=true + shift + ;; + patch|minor|major) + VERSION_BUMP="$1" + shift ;; *) - echo "Invalid bump argument. Usage: $0 [patch (default)|minor|major]" + echo "Invalid argument. Usage: $0 [patch|minor|major] [--beta]" exit 1 ;; esac +done + +# Set tag prefix based on beta flag +if [ "$BETA_BUILD" = true ]; then + TAG_START="trigger-beta-build" fi +# Set version bump (default to patch) +if [ -z "$VERSION_BUMP" ]; then + VERSION_BUMP="$DEFAULT_TAG_BUMP" +fi + +TAG="$TAG_START-$TAG_BUMP-$VERSION_BUMP" + if [ "$TAG" != "$DEFAULT_TAG" ]; then read -p "Are you sure you want to push tag '$TAG'? (y/n): " choice if [ "$choice" != "y" ]; then From 85e75528e020db9bd4f2f591de8ac46ea83fbbb5 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sat, 13 Sep 2025 10:06:14 +0300 Subject: [PATCH 05/75] Update icon for iOS 26 --- .../AppIcon.icon/Assets/Artboard 1 12.svg | 4 --- Zotero/Assets/AppIcon.icon/Assets/cover.svg | 4 +++ Zotero/Assets/AppIcon.icon/icon.json | 30 +++++++------------ 3 files changed, 15 insertions(+), 23 deletions(-) delete mode 100644 Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg create mode 100644 Zotero/Assets/AppIcon.icon/Assets/cover.svg diff --git a/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg b/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg deleted file mode 100644 index 11db3a08f..000000000 --- a/Zotero/Assets/AppIcon.icon/Assets/Artboard 1 12.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/Assets/cover.svg b/Zotero/Assets/AppIcon.icon/Assets/cover.svg new file mode 100644 index 000000000..3f4c90af7 --- /dev/null +++ b/Zotero/Assets/AppIcon.icon/Assets/cover.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Zotero/Assets/AppIcon.icon/icon.json b/Zotero/Assets/AppIcon.icon/icon.json index b5dde1ca7..b93b6a02b 100644 --- a/Zotero/Assets/AppIcon.icon/icon.json +++ b/Zotero/Assets/AppIcon.icon/icon.json @@ -186,7 +186,6 @@ } } ], - "hidden" : false, "image-name" : "default 4.svg", "name" : "sticky-notes", "opacity-specializations" : [ @@ -254,16 +253,12 @@ "hidden" : false, "layers" : [ { - "fill-specializations" : [ - { - "appearance" : "dark", - "value" : "none" - } - ], - "hidden" : false, - "image-name" : "Artboard 1 12.svg", + "image-name" : "cover.svg", "name" : "cover", "opacity-specializations" : [ + { + "value" : 1 + }, { "appearance" : "dark", "value" : 0 @@ -272,14 +267,7 @@ "appearance" : "tinted", "value" : 0 } - ], - "position" : { - "scale" : 1, - "translation-in-points" : [ - 0, - 0 - ] - } + ] } ], "name" : "Group", @@ -290,6 +278,10 @@ { "appearance" : "dark", "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 1 } ], "shadow-specializations" : [ @@ -317,7 +309,7 @@ { "value" : { "enabled" : true, - "value" : 0.7 + "value" : 0.5 } }, { @@ -331,7 +323,7 @@ "appearance" : "tinted", "value" : { "enabled" : true, - "value" : 0.4 + "value" : 1 } } ] From 541d3c02ba0587c023271ccda8bc7f851190df71 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 16 Sep 2025 21:19:29 +0300 Subject: [PATCH 06/75] Fix CitationController crash regression when an error occurs --- Zotero/Controllers/Citation/CitationController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Zotero/Controllers/Citation/CitationController.swift b/Zotero/Controllers/Citation/CitationController.swift index 028bc0b9a..f4cb41836 100644 --- a/Zotero/Controllers/Citation/CitationController.swift +++ b/Zotero/Controllers/Citation/CitationController.swift @@ -161,6 +161,7 @@ class CitationController: NSObject { .do(onSuccess: { [weak self] session in self?.citationWebViewHandlerBySession[session] = citationWebViewHandler }) + .observe(on: MainScheduler.instance) /// Loads style data. /// - parameter styleId: Identifier of style From a155dfaa11b87af5ca8f1b35e77a92ecf47f4891 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 18 Sep 2025 08:52:43 +0300 Subject: [PATCH 07/75] Fix iOS 26 item detail editing --- .../ItemDetail/Views/ItemDetailCollectionViewHandler.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift index 9d194aa75..4ed69590b 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift @@ -461,6 +461,9 @@ final class ItemDetailCollectionViewHandler: NSObject { .map({ SectionType(identifier: id, section: $0) }) var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections(sections) + if #available(iOS 26.0, *) { + snapshot.reloadSections(sections) + } for section in sections { snapshot.appendItems(rows(for: section.section, state: state), toSection: section) } From a9dd4527b1fedf4eec864d6ed2406a46b2db011e Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 18 Sep 2025 12:14:52 +0300 Subject: [PATCH 08/75] Fix support for file editing (#1174) * Fix add actions library editing permissions checks * In adding by identifier if library not file editable ignore attachments * In share extension if picked library not file editable ignore attachment * Remove convert to standalone attachment action from url attachment menu * Use first linked URL if any for item accessory without file attachments * Improve code --- .../ShareViewController.swift | 102 +++++++++--------- ZShare/ViewModels/ExtensionViewModel.swift | 17 ++- Zotero/Controllers/AttachmentCreator.swift | 61 ++++++++--- .../IdentifierLookupController.swift | 9 +- Zotero/Scenes/Detail/DetailCoordinator.swift | 16 ++- .../ItemDetailCollectionViewHandler.swift | 8 +- .../Scenes/General/Models/ItemAccessory.swift | 10 +- .../Views/NoteEditorViewController.swift | 2 +- 8 files changed, 143 insertions(+), 82 deletions(-) diff --git a/ZShare/View Controllers/ShareViewController.swift b/ZShare/View Controllers/ShareViewController.swift index a4368932f..d34b8efdb 100644 --- a/ZShare/View Controllers/ShareViewController.swift +++ b/ZShare/View Controllers/ShareViewController.swift @@ -237,7 +237,13 @@ final class ShareViewController: UIViewController { let hasItem = state.processedAttachment != nil self.log(attachmentState: state.attachmentState, itemState: state.itemPickerState) - self.update(item: state.expectedItem, attachment: state.expectedAttachment, attachmentState: state.attachmentState, defaultTitle: state.title) + update( + libraryIsFilesEditable: state.collectionPickerState.libraryIsFilesEditable, + item: state.expectedItem, + attachment: state.expectedAttachment, + attachmentState: state.attachmentState, + defaultTitle: state.title + ) self.update(attachmentState: state.attachmentState, itemState: state.itemPickerState, hasItem: hasItem, isSubmitting: state.isSubmitting) self.update(collectionPicker: state.collectionPickerState, recents: state.recents) self.update(itemPicker: state.itemPickerState, hasExpectedItem: (state.expectedItem != nil || state.expectedAttachment != nil)) @@ -287,7 +293,7 @@ final class ShareViewController: UIViewController { self.updateBottomProgress(for: state, itemState: itemState, hasItem: hasItem, isSubmitting: isSubmitting) } - private func update(item: ItemResponse?, attachment: (String, File)?, attachmentState: ExtensionViewModel.State.AttachmentState, defaultTitle title: String?) { + private func update(libraryIsFilesEditable: Bool, item: ItemResponse?, attachment: (String, File)?, attachmentState: ExtensionViewModel.State.AttachmentState, defaultTitle title: String?) { self.translationContainer.isHidden = false if item == nil && attachment == nil { @@ -306,23 +312,52 @@ final class ShareViewController: UIViewController { return } - self.itemContainer.isHidden = item == nil - self.attachmentContainer.isHidden = attachment == nil + let itemFound: Bool + if let item { + itemFound = true + // Item was found, show its metadata. + let itemTitle = itemTitle(for: item, schemaController: schemaController, defaultValue: title ?? "") + setItem(title: itemTitle, type: item.rawType) + itemContainer.isHidden = false + } else { + itemFound = false + itemContainer.isHidden = true + } + if libraryIsFilesEditable, let (attachmentTitle, file) = attachment { + // The picked library allows file editing, and either item with attachment, or only attachment (local/remote file), was found, show its metadata. + setAttachment(title: attachmentTitle, file: file, state: attachmentState) + attachmentContainerLeft.constant = itemFound ? Self.childAttachmentLeftOffset : 0 + attachmentContainer.isHidden = false + } else { + attachmentContainer.isHidden = true + } + + func setAttachment(title: String, file: File, state: ExtensionViewModel.State.AttachmentState) { + attachmentTitleLabel.text = title + let type: Attachment.Kind = .file(filename: "", contentType: file.mimeType, location: .local, linkType: .importedFile, compressed: false) + let iconState = FileAttachmentView.State.stateFrom(type: type, progress: nil, error: state.error) + attachmentIcon.set(state: iconState, style: .shareExtension) - if let item = item, let (attachmentTitle, file) = attachment { - // Item with attachment was found, show their metadata - let itemTitle = self.itemTitle(for: item, schemaController: self.schemaController, defaultValue: title ?? "") - self.setItem(title: itemTitle, type: item.rawType) - self.attachmentContainerLeft.constant = ShareViewController.childAttachmentLeftOffset - self.setAttachment(title: attachmentTitle, file: file, state: attachmentState) - } else if let item = item { - // Only item was found, show metadata - let title = self.itemTitle(for: item, schemaController: self.schemaController, defaultValue: title ?? "") - self.setItem(title: title, type: item.rawType) - } else if let (title, file) = attachment { - // Only attachment (local/remote file) was found, show metadata - self.attachmentContainerLeft.constant = 0 - self.setAttachment(title: title, file: file, state: attachmentState) + switch state { + case .downloading(let progress): + attachmentProgressView.isHidden = progress == 0 + attachmentActivityIndicator.isHidden = progress > 0 + attachmentProgressView.progress = CGFloat(progress) + if progress == 0 && !attachmentActivityIndicator.isAnimating { + attachmentActivityIndicator.startAnimating() + } + attachmentIcon.alpha = 0.5 + attachmentTitleLabel.alpha = 0.5 + + default: + attachmentProgressView.isHidden = true + if attachmentActivityIndicator.isAnimating { + attachmentActivityIndicator.stopAnimating() + } + attachmentActivityIndicator.isHidden = true + attachmentIcon.alpha = 1 + attachmentTitleLabel.alpha = 1 + } } } @@ -335,37 +370,6 @@ final class ShareViewController: UIViewController { self.itemIcon.image = UIImage(named: ItemTypes.iconName(for: type)) } - private func setAttachment(title: String, file: File, state: ExtensionViewModel.State.AttachmentState) { - self.attachmentTitleLabel.text = title - let type: Attachment.Kind = .file(filename: "", contentType: file.mimeType, location: .local, linkType: .importedFile, compressed: false) - let iconState = FileAttachmentView.State.stateFrom(type: type, progress: nil, error: state.error) - self.attachmentIcon.set(state: iconState, style: .shareExtension) - - switch state { - case .downloading(let progress): - self.attachmentProgressView.isHidden = progress == 0 - self.attachmentActivityIndicator.isHidden = progress > 0 - self.attachmentProgressView.progress = CGFloat(progress) - if progress == 0 && !self.attachmentActivityIndicator.isAnimating { - self.attachmentActivityIndicator.startAnimating() - } - - self.attachmentIcon.alpha = 0.5 - self.attachmentTitleLabel.alpha = 0.5 - - default: - if !self.attachmentContainer.isHidden { - self.attachmentProgressView.isHidden = true - if self.attachmentActivityIndicator.isAnimating { - self.attachmentActivityIndicator.stopAnimating() - } - self.attachmentActivityIndicator.isHidden = true - self.attachmentIcon.alpha = 1 - self.attachmentTitleLabel.alpha = 1 - } - } - } - private func updateNavigationItems(for state: ExtensionViewModel.State.AttachmentState, isSubmitting: Bool) { if let error = state.error { switch error { diff --git a/ZShare/ViewModels/ExtensionViewModel.swift b/ZShare/ViewModels/ExtensionViewModel.swift index 6719a5588..b18c16614 100644 --- a/ZShare/ViewModels/ExtensionViewModel.swift +++ b/ZShare/ViewModels/ExtensionViewModel.swift @@ -37,6 +37,16 @@ final class ExtensionViewModel { enum CollectionPickerState { case loading, failed case picked(Library, Collection?) + + var libraryIsFilesEditable: Bool { + switch self { + case .loading, .failed: + return false + + case let .picked(library, _): + return library.filesEditable + } + } } struct ItemPickerState { @@ -1049,7 +1059,12 @@ final class ExtensionViewModel { case .itemWithAttachment(let item, let attachmentData, let attachmentFile): let newTags = (Defaults.shared.shareExtensionIncludeTags ? item.tags + tags : tags) - attachment = .itemWithAttachment(item: item.copy(libraryId: libraryId, collectionKeys: collectionKeys, tags: newTags), attachment: attachmentData, attachmentFile: attachmentFile) + if state.collectionPickerState.libraryIsFilesEditable { + attachment = .itemWithAttachment(item: item.copy(libraryId: libraryId, collectionKeys: collectionKeys, tags: newTags), attachment: attachmentData, attachmentFile: attachmentFile) + } else { + // Picked library doesn't allow file editing, convert attachment to item only. + attachment = .item(item.copy(libraryId: libraryId, collectionKeys: collectionKeys, tags: newTags)) + } case .file: break } diff --git a/Zotero/Controllers/AttachmentCreator.swift b/Zotero/Controllers/AttachmentCreator.swift index d918ec449..5552b06ec 100644 --- a/Zotero/Controllers/AttachmentCreator.swift +++ b/Zotero/Controllers/AttachmentCreator.swift @@ -22,10 +22,9 @@ struct AttachmentCreator { private static let mainAttachmentContentTypes: Set = ["text/html", "application/pdf", "image/png", "image/jpeg", "image/gif", "text/plain", "application/epub+zip"] - static func mainAttachment(for item: RItem, fileStorage: FileStorage) -> Attachment? { + static func mainAttachment(for item: RItem, fileStorage: FileStorage, urlDetector: UrlDetector?) -> Attachment? { if item.rawType == ItemTypes.attachment { - // If item is attachment, create `Attachment` and ignore linked attachments. - if let attachment = attachment(for: item, fileStorage: fileStorage, urlDetector: nil) { + if let attachment = attachment(for: item, fileStorage: fileStorage, urlDetector: urlDetector) { switch attachment.type { case .url: return attachment @@ -40,20 +39,54 @@ struct AttachmentCreator { return nil } - var attachmentData = attachmentData(for: item) - - guard !attachmentData.isEmpty else { return nil } - - attachmentData.sort { lData, rData in + if let fileAttachment = fileAttachmentData(for: item).sorted(by: { lData, rData in mainAttachmentsAreInIncreasingOrder(lData: (lData.1, lData.3, lData.4), rData: (rData.1, rData.3, rData.4)) + }).first.flatMap({ fileAttachmentDataToAttachment($0) }) { + return fileAttachment + } + return firstLinkedURLAttachmentIfAny(for: item, urlDetector: urlDetector) + + func fileAttachmentData(for item: RItem) -> [(Int, String, LinkMode, Bool, Date)] { + let itemUrl = item.fields.first(where: { $0.key == FieldKeys.Item.url })?.value + var data: [(Int, String, LinkMode, Bool, Date)] = [] + for (idx, child) in item.children.enumerated() { + guard (child.rawType == ItemTypes.attachment) && (child.syncState != .dirty) && !child.trash, + let linkMode = child.fields.first(where: { $0.key == FieldKeys.Item.Attachment.linkMode }).flatMap({ LinkMode(rawValue: $0.value) }), + (linkMode == .importedUrl) || (linkMode == .importedFile), + let contentType = contentType(for: child), + AttachmentCreator.mainAttachmentContentTypes.contains(contentType) else { continue } + + var hasMatchingUrlWithParent = false + if let url = itemUrl, let childUrl = child.fields.first(where: { $0.key == FieldKeys.Item.Attachment.url })?.value { + hasMatchingUrlWithParent = url == childUrl + } + data.append((idx, contentType, linkMode, hasMatchingUrlWithParent, child.dateAdded)) + } + return data } - guard let (idx, contentType, linkMode, _, _) = attachmentData.first else { return nil } - let rAttachment = item.children[idx] - let linkType: Attachment.FileLinkType = linkMode == .importedFile ? .importedFile : .importedUrl - guard let libraryId = rAttachment.libraryId else { return nil } - let type = importedType(for: rAttachment, contentType: contentType, libraryId: libraryId, fileStorage: fileStorage, linkType: linkType, compressed: rAttachment.fileCompressed) - return Attachment(item: rAttachment, type: type) + func fileAttachmentDataToAttachment(_ data: (Int, String, LinkMode, Bool, Date)) -> Attachment? { + let (idx, contentType, linkMode, _, _) = data + let rAttachment = item.children[idx] + let linkType: Attachment.FileLinkType = linkMode == .importedFile ? .importedFile : .importedUrl + guard let libraryId = rAttachment.libraryId else { return nil } + let type = importedType(for: rAttachment, contentType: contentType, libraryId: libraryId, fileStorage: fileStorage, linkType: linkType, compressed: rAttachment.fileCompressed) + return Attachment(item: rAttachment, type: type) + } + + func firstLinkedURLAttachmentIfAny(for item: RItem, urlDetector: UrlDetector?) -> Attachment? { + guard let urlDetector else { return nil } + for child in item.children { + guard (child.rawType == ItemTypes.attachment) && (child.syncState != .dirty) && !child.trash, + let linkMode = child.fields.first(where: { $0.key == FieldKeys.Item.Attachment.linkMode }).flatMap({ LinkMode(rawValue: $0.value) }), + linkMode == .linkedUrl, + let libraryId = child.libraryId, + let attachmentType = linkedUrlType(for: child, libraryId: libraryId, urlDetector: urlDetector) + else { continue } + return Attachment(item: child, type: attachmentType) + } + return nil + } } static func mainPdfAttachment(from attachments: [Attachment], parentUrl: String?) -> Attachment? { diff --git a/Zotero/Controllers/IdentifierLookupController.swift b/Zotero/Controllers/IdentifierLookupController.swift index 2912fb6e8..3879e8357 100644 --- a/Zotero/Controllers/IdentifierLookupController.swift +++ b/Zotero/Controllers/IdentifierLookupController.swift @@ -455,8 +455,11 @@ final class IdentifierLookupController { } func storeDataAndDownloadAttachmentIfNecessary(identifier: String, response: ItemResponse, attachments: [(Attachment, URL)]) throws { - let request = CreateTranslatedItemsDbRequest(responses: [response], schemaController: schemaController, dateParser: dateParser) - _ = try dbStorage.perform(request: request, on: backgroundQueue) + var library: Library? + try dbStorage.perform(on: backgroundQueue) { coordinator in + _ = try coordinator.perform(request: CreateTranslatedItemsDbRequest(responses: [response], schemaController: schemaController, dateParser: dateParser)) + library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) + } changeLookup( for: identifier, to: .translated(.init(response: response, attachments: attachments, libraryId: libraryId, collectionKeys: collectionKeys)) @@ -464,7 +467,7 @@ final class IdentifierLookupController { guard let self, didChange else { return } observable.on(.next(Update(kind: .itemStored(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupData.values)))) - if Defaults.shared.shareExtensionIncludeAttachment, !attachments.isEmpty { + if Defaults.shared.shareExtensionIncludeAttachment, library?.filesEditable == true, !attachments.isEmpty { let downloadData = attachments.map({ ($0, $1, response.key) }) remoteFileDownloader.download(data: downloadData) observable.on(.next(Update(kind: .pendingAttachments(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupData.values)))) diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index a41d71844..81b870882 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -441,15 +441,13 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { let controller = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) controller.popoverPresentationController?.sourceItem = button - if viewModel.state.library.metadataAndFilesEditable { - controller.addAction(UIAlertAction(title: L10n.Items.lookup, style: .default, handler: { [weak self] _ in - self?.showLookup(startWith: .manual(restoreLookupState: false)) - })) + controller.addAction(UIAlertAction(title: L10n.Items.lookup, style: .default, handler: { [weak self] _ in + self?.showLookup(startWith: .manual(restoreLookupState: false)) + })) - controller.addAction(UIAlertAction(title: L10n.Items.barcode, style: .default, handler: { [weak self] _ in - self?.showLookup(startWith: .scanner) - })) - } + controller.addAction(UIAlertAction(title: L10n.Items.barcode, style: .default, handler: { [weak self] _ in + self?.showLookup(startWith: .scanner) + })) controller.addAction(UIAlertAction(title: L10n.Items.new, style: .default, handler: { [weak self, weak viewModel] _ in guard let self, let viewModel else { return } @@ -471,7 +469,7 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { showNote(library: viewModel.state.library, kind: .standaloneCreation(collection: viewModel.state.collection), saveCallback: nil) })) - if viewModel.state.library.metadataAndFilesEditable { + if viewModel.state.library.filesEditable { controller.addAction(UIAlertAction(title: L10n.Items.newFile, style: .default, handler: { [weak self, weak viewModel] _ in self?.showAttachmentPicker(save: { urls in viewModel?.process(action: .addAttachments(urls)) diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift index 4ed69590b..3b96d45bf 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift @@ -995,9 +995,11 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { } if !viewModel.state.data.isAttachment { - actions.append(UIAction(title: L10n.ItemDetail.moveToStandaloneAttachment, image: UIImage(systemName: "arrow.up.to.line"), attributes: []) { [weak self] _ in - self?.viewModel.process(action: .moveAttachmentToStandalone(attachment)) - }) + if case .file = attachment.type { + actions.append(UIAction(title: L10n.ItemDetail.moveToStandaloneAttachment, image: UIImage(systemName: "arrow.up.to.line"), attributes: []) { [weak self] _ in + self?.viewModel.process(action: .moveAttachmentToStandalone(attachment)) + }) + } actions.append(UIAction(title: L10n.moveToTrash, image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in self?.viewModel.process(action: .deleteAttachment(attachment)) diff --git a/Zotero/Scenes/General/Models/ItemAccessory.swift b/Zotero/Scenes/General/Models/ItemAccessory.swift index 3da224c18..7ed2e9b1e 100644 --- a/Zotero/Scenes/General/Models/ItemAccessory.swift +++ b/Zotero/Scenes/General/Models/ItemAccessory.swift @@ -39,8 +39,14 @@ extension ItemAccessory { } static func create(from item: RItem, fileStorage: FileStorage, urlDetector: UrlDetector) -> ItemAccessory? { - if let attachment = AttachmentCreator.mainAttachment(for: item, fileStorage: fileStorage) { - return .attachment(attachment: attachment, parentKey: (item.key != attachment.key) ? item.key : nil) + if let attachment = AttachmentCreator.mainAttachment(for: item, fileStorage: fileStorage, urlDetector: urlDetector) { + switch attachment.type { + case .file: + return .attachment(attachment: attachment, parentKey: (item.key != attachment.key) ? item.key : nil) + + case .url(let url): + return .url(url) + } } if let urlString = item.urlString, urlDetector.isUrl(string: urlString), let url = URL(string: urlString) { diff --git a/Zotero/Scenes/General/Views/NoteEditorViewController.swift b/Zotero/Scenes/General/Views/NoteEditorViewController.swift index a071d3ac9..58e555036 100644 --- a/Zotero/Scenes/General/Views/NoteEditorViewController.swift +++ b/Zotero/Scenes/General/Views/NoteEditorViewController.swift @@ -303,7 +303,7 @@ final class NoteEditorViewController: UIViewController { let (key, libraryId) = uriConverter.convert(uri: uri), let locator = (rawItem["locator"] as? String).flatMap(Int.init), let item = try? dbStorage.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key), on: .main), - let attachment = AttachmentCreator.mainAttachment(for: item, fileStorage: fileStorage) + let attachment = AttachmentCreator.mainAttachment(for: item, fileStorage: fileStorage, urlDetector: nil) else { return nil } return CitationMetadata(attachmentKey: attachment.key, parentKey: key, libraryId: libraryId, locator: locator) } From a77e8f4a82e125d9e503456f7071ae71cfd48482 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 22 Sep 2025 12:23:36 +0300 Subject: [PATCH 09/75] Fix PDF reader memory leak (#1176) * Fix AnnocationCell disposeBag memory leak * Improve retention of ViewModel instances --- Zotero/Scenes/Detail/PDF/Views/AnnotationCell.swift | 4 ++++ .../Detail/PDF/Views/PDFAnnotationsViewController.swift | 2 +- Zotero/Scenes/Detail/PDF/Views/PDFSidebarViewController.swift | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Zotero/Scenes/Detail/PDF/Views/AnnotationCell.swift b/Zotero/Scenes/Detail/PDF/Views/AnnotationCell.swift index 94e901ca6..393328419 100644 --- a/Zotero/Scenes/Detail/PDF/Views/AnnotationCell.swift +++ b/Zotero/Scenes/Detail/PDF/Views/AnnotationCell.swift @@ -40,6 +40,10 @@ final class AnnotationCell: UITableViewCell { disposeBag?.dispose() } + deinit { + disposeBag?.dispose() + } + // MARK: - Actions func updatePreview(image: UIImage?) { diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift index e9d741efd..299752388 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift @@ -17,7 +17,7 @@ typealias AnnotationsViewControllerAction = (AnnotationView.Action, Annotation, final class PDFAnnotationsViewController: UIViewController { private static let cellId = "AnnotationCell" - private unowned let viewModel: ViewModel + private let viewModel: ViewModel private let updateQueue: DispatchQueue private let disposeBag: DisposeBag diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFSidebarViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFSidebarViewController.swift index 9e9dc01ee..f5757783a 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFSidebarViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFSidebarViewController.swift @@ -40,7 +40,7 @@ class PDFSidebarViewController: UIViewController { } } - private unowned let viewModel: ViewModel + private let viewModel: ViewModel private let disposeBag: DisposeBag private weak var picker: UISegmentedControl! From a5a90dc29674229d8f98b257973e246c774b0481 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 22 Sep 2025 15:23:33 +0300 Subject: [PATCH 10/75] Update dependencies (#1177) * Update swiftlint rules * Update SPM dependencies --- .swiftlint.yml | 12 ++++++------ Zotero.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/swiftpm/Package.resolved | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index ec0ea9155..4bcda2d7e 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -12,7 +12,9 @@ only_rules: - empty_enum_arguments - empty_parameters - empty_parentheses_with_trailing_closure + - function_name_whitespace - implicit_getter + - implicit_optional_initialization - leading_whitespace - legacy_cggeometry_functions - legacy_constant @@ -25,13 +27,11 @@ only_rules: - no_space_in_method_call - ns_number_init_as_function_reference - opening_brace - - operator_whitespace - orphaned_doc_comment - private_over_fileprivate - private_unit_test - protocol_property_accessors_order - redundant_discardable_let - - redundant_optional_initialization - redundant_set_access_control - redundant_string_enum_value - redundant_void_return @@ -140,10 +140,14 @@ fallthrough: error flatmap_over_map_reduce: error +function_name_whitespace: error + identical_operands: error implicit_getter: error +implicit_optional_initialization: error + joined_default_parameter: error leading_whitespace: error @@ -178,8 +182,6 @@ operator_usage_whitespace: skip_aligned_constants: true allowed_no_space_operators: ["...", "..<"] -operator_whitespace: error - orphaned_doc_comment: error overridden_super_call: @@ -201,8 +203,6 @@ protocol_property_accessors_order: error redundant_discardable_let: error -redundant_optional_initialization: error - redundant_set_access_control: error redundant_string_enum_value: error diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index a962f1ae0..854a277bb 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -6888,7 +6888,7 @@ repositoryURL = "https://github.com/apple/swift-collections.git"; requirement = { kind = exactVersion; - version = 1.2.0; + version = 1.2.1; }; }; B3445F4426EF5EE9007D4009 /* XCRemoteSwiftPackageReference "plcrashreporter" */ = { @@ -6968,7 +6968,7 @@ repositoryURL = "https://github.com/CocoaLumberjack/CocoaLumberjack"; requirement = { kind = exactVersion; - version = 3.8.5; + version = 3.9.0; }; }; B35C9C042642A0BC0004C47E /* XCRemoteSwiftPackageReference "realm-swift" */ = { @@ -6992,7 +6992,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 14.10.0; + version = 26.0.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 70ac2cbb9..facaab8b3 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -15,8 +15,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/CocoaLumberjack/CocoaLumberjack", "state" : { - "revision" : "4b8714a7fb84d42393314ce897127b3939885ec3", - "version" : "3.8.5" + "revision" : "a9ed4b6f9bdedce7d77046f43adfb8ce1fd54114", + "version" : "3.9.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "19c91153cf22e0f083938e4254b69db38843cb3b", - "version" : "14.10.0" + "revision" : "4cdcc56c51b731908131a86c70fe76a9354e658e", + "version" : "26.0.0" } }, { @@ -159,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "c1805596154bb3a265fd91b8ac0c4433b4348fb0", - "version" : "1.2.0" + "revision" : "8c0c0a8b49e080e54e5e328cc552821ff07cd341", + "version" : "1.2.1" } }, { From bd2826e07e6f5702410440efc4f390443a0a2b1b Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Tue, 30 Sep 2025 13:39:46 +0200 Subject: [PATCH 11/75] Improved api error logging (#1180) --- Zotero/Controllers/Debugging/ApiLogger.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotero/Controllers/Debugging/ApiLogger.swift b/Zotero/Controllers/Debugging/ApiLogger.swift index 536b77cc1..284e642f8 100644 --- a/Zotero/Controllers/Debugging/ApiLogger.swift +++ b/Zotero/Controllers/Debugging/ApiLogger.swift @@ -73,7 +73,7 @@ struct ApiLogger { if error.response.isEmpty || error.response == "No Response" { DDLogError("\(error.error)") } else { - DDLogError(DDLogMessageFormat(stringLiteral: error.response)) + DDLogError("\(error.response) - \(error.error)") } } From 5154cbdf884135bb24e4ec88896facfcf586fcf2 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 30 Sep 2025 14:41:53 +0300 Subject: [PATCH 12/75] Improve PDF document load (#1179) --- Zotero/Models/AnnotationsConfig.swift | 1 + .../Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift | 4 ++++ .../Scenes/Detail/PDF/Views/PDFDocumentViewController.swift | 1 + Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift | 4 ++-- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Zotero/Models/AnnotationsConfig.swift b/Zotero/Models/AnnotationsConfig.swift index 9a98fbe24..3106c52be 100644 --- a/Zotero/Models/AnnotationsConfig.swift +++ b/Zotero/Models/AnnotationsConfig.swift @@ -45,6 +45,7 @@ struct AnnotationsConfig { // Size of note annotation in PDF document. static let noteAnnotationSize: CGSize = CGSize(width: 22, height: 22) static let supported: PSPDFKit.Annotation.Kind = [.note, .highlight, .square, .ink, .underline, .freeText] + static let editableAnnotationTypes: Set = Set([.note, .highlight, .square, .ink, .underline, .freeText]) static func colors(for type: AnnotationType) -> [String] { switch type { diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index 8b4168c71..a68c22106 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -2130,6 +2130,10 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi var annotations: [String: PDFDocumentAnnotation] = [:] for pdfAnnotation in documentAnnotations { + if pdfAnnotation is LinkAnnotation { + // Ignored Link Annotation, as they are not editable, and if numerous they can create a noticeable hang the first time the document lazily evaluates dirty annotations. + continue + } pdfAnnotation.flags.update(with: .locked) // Unsupported annotations aren't visible in sidebar diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift index 492842408..10f8c3df5 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift @@ -634,6 +634,7 @@ final class PDFDocumentViewController: UIViewController { builder.overrideClass(PSPDFKit.AnnotationManager.self, with: AnnotationManager.self) builder.overrideClass(PSPDFKitUI.FreeTextAnnotationView.self, with: FreeTextAnnotationView.self) builder.propertiesForAnnotations = [.freeText: []] + builder.editableAnnotationTypes = AnnotationsConfig.editableAnnotationTypes } let controller = PDFViewController(document: document, configuration: pdfConfiguration) diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index 0384ed714..0f392eb7b 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -41,7 +41,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { weak var annotationToolbarController: AnnotationToolbarViewController? private var documentTop: NSLayoutConstraint! var annotationToolbarHandler: AnnotationToolbarHandler? - private var intraDocumentNavigationHandler: IntraDocumentNavigationButtonsHandler! + private var intraDocumentNavigationHandler: IntraDocumentNavigationButtonsHandler? private var selectedText: String? private(set) var isCompactWidth: Bool @CodableUserDefault(key: "PDFReaderToolbarState", defaultValue: AnnotationToolbarHandler.State(position: .leading, visible: true), encoder: Defaults.jsonEncoder, decoder: Defaults.jsonDecoder) @@ -890,7 +890,7 @@ extension PDFReaderViewController: PDFDocumentDelegate { } statusBarVisible = !isHidden - intraDocumentNavigationHandler.interfaceIsVisible = !isHidden + intraDocumentNavigationHandler?.interfaceIsVisible = !isHidden annotationToolbarHandler?.interfaceVisibilityDidChange() UIView.animate(withDuration: 0.15, animations: { [weak self] in From 9d9a3a89bae6e10c47be75728301e0b69474df40 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 30 Sep 2025 15:41:35 +0300 Subject: [PATCH 13/75] Improve annotation page label default value (#1178) --- Zotero/Controllers/AnnotationConverter.swift | 3 +- .../Detail/PDF/Models/PDFReaderState.swift | 17 ++++++ .../ViewModels/PDFReaderActionHandler.swift | 57 ++++++++++++++++++- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/Zotero/Controllers/AnnotationConverter.swift b/Zotero/Controllers/AnnotationConverter.swift index 14c583837..cdc243fe4 100644 --- a/Zotero/Controllers/AnnotationConverter.swift +++ b/Zotero/Controllers/AnnotationConverter.swift @@ -60,13 +60,14 @@ struct AnnotationConverter { library: Library, username: String, displayName: String, + defaultPageLabel: PDFReaderState.DefaultAnnotationPageLabel?, boundingBoxConverter: AnnotationBoundingBoxConverter? ) -> PDFDocumentAnnotation? { guard let document = annotation.document, AnnotationsConfig.supported.contains(annotation.type) else { return nil } let key = annotation.key ?? annotation.uuid let page = Int(annotation.pageIndex) - let pageLabel = document.pageLabelForPage(at: annotation.pageIndex, substituteWithPlainLabel: false) ?? "\(annotation.pageIndex + 1)" + let pageLabel = defaultPageLabel?.label(for: Int(annotation.pageIndex)) ?? document.pageLabelForPage(at: annotation.pageIndex, substituteWithPlainLabel: false) ?? "\(annotation.pageIndex + 1)" let isAuthor = annotation.user == displayName || annotation.user == username let comment = annotation.contents.flatMap({ $0.trimmingCharacters(in: .whitespacesAndNewlines) }) ?? "" let sortIndex = self.sortIndex(from: annotation, boundingBoxConverter: boundingBoxConverter) diff --git a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift index c57edbace..34a3e38e6 100644 --- a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift +++ b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift @@ -99,6 +99,21 @@ struct PDFReaderState: ViewModelState { } } + enum DefaultAnnotationPageLabel { + case commonPageOffset(offset: Int) + case labelPerPage(labelsByPage: [Int: String]) + + func label(for page: Int) -> String? { + switch self { + case .commonPageOffset(let offset): + return "\(page + offset)" + + case .labelPerPage(let labelsByPage): + return labelsByPage[page] ?? "\(page + 1)" + } + } + } + let key: String let parentKey: String? let document: PSPDFKit.Document @@ -115,6 +130,7 @@ struct PDFReaderState: ViewModelState { var itemToken: NotificationToken? var databaseAnnotations: Results! var documentAnnotations: [String: PDFDocumentAnnotation] + var defaultAnnotationPageLabel: DefaultAnnotationPageLabel var texts: [String: (String, [UIFont: NSAttributedString])] var comments: [String: NSAttributedString] var searchTerm: String? @@ -184,6 +200,7 @@ struct PDFReaderState: ViewModelState { self.username = username self.sortedKeys = [] self.documentAnnotations = [:] + self.defaultAnnotationPageLabel = .commonPageOffset(offset: 1) self.texts = [:] self.comments = [:] self.visiblePage = 0 diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index a68c22106..e4da2551d 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -1470,6 +1470,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi library: viewModel.state.library, username: viewModel.state.username, displayName: viewModel.state.displayName, + defaultPageLabel: viewModel.state.defaultAnnotationPageLabel, boundingBoxConverter: boundingBoxConverter ) guard let documentAnnotation else { return nil } @@ -1831,6 +1832,8 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi let sortStartTime = CFAbsoluteTimeGetCurrent() let sortedKeys = createSortedKeys(fromDatabaseAnnotations: databaseAnnotations, documentAnnotations: documentAnnotations) + let defaultAnnotationPageLabelStartTime = CFAbsoluteTimeGetCurrent() + let defaultAnnotationPageLabel = defaultAnnotationPageLabel(fromDatabaseAnnotations: databaseAnnotations) let (page, selectedData) = preselectedData(databaseAnnotations: databaseAnnotations, storedPage: storedPage, boundingBoxConverter: boundingBoxConverter, in: viewModel) let updateDocumentStartTime = CFAbsoluteTimeGetCurrent() @@ -1843,6 +1846,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi state.library = library state.libraryToken = libraryToken state.databaseAnnotations = databaseAnnotations + state.defaultAnnotationPageLabel = defaultAnnotationPageLabel state.documentAnnotations = documentAnnotations state.sortedKeys = sortedKeys state.visiblePage = page @@ -1859,9 +1863,13 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi } DDLogInfo("PDFReaderActionHandler: loaded PDF with \(viewModel.state.document.pageCount) pages, \(documentAnnotations.count) document annotations, \(dbToPdfAnnotations.count) zotero annotations") - let timeLog = "PDFReaderActionHandler: total time \(endTime - startTime), initial loading: \(loadDocumentAnnotationsStartTime - startTime), " + - "load document annotations: \(convertDbAnnotationsStartTime - loadDocumentAnnotationsStartTime), " + - "load zotero annotations: \(sortStartTime - convertDbAnnotationsStartTime), " + "sort keys: \(updateDocumentStartTime - sortStartTime), update document: \(endTime - updateDocumentStartTime)" + var timeLog = "PDFReaderActionHandler: total time \(endTime - startTime)" + timeLog += ", initial loading: \(loadDocumentAnnotationsStartTime - startTime)" + timeLog += ", load document annotations: \(convertDbAnnotationsStartTime - loadDocumentAnnotationsStartTime)" + timeLog += ", load zotero annotations: \(sortStartTime - convertDbAnnotationsStartTime)" + timeLog += ", sort keys: \(defaultAnnotationPageLabelStartTime - sortStartTime)" + timeLog += ", default annotation page label: \(updateDocumentStartTime - defaultAnnotationPageLabelStartTime)" + timeLog += ", update document: \(endTime - updateDocumentStartTime)" DDLogInfo(DDLogMessageFormat(stringLiteral: timeLog)) observeDocument(in: viewModel) @@ -2117,6 +2125,30 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi } } + private func defaultAnnotationPageLabel(fromDatabaseAnnotations databaseAnnotations: Results) -> PDFReaderState.DefaultAnnotationPageLabel { + var uniquePageLabelsCountByPage: [Int: [String: Int]] = [:] + for item in databaseAnnotations { + guard let annotation = PDFDatabaseAnnotation(item: item), let page = annotation._page, let pageLabel = annotation._pageLabel, !pageLabel.isEmpty, pageLabel != "-" else { continue } + var uniquePageLabelsCount = uniquePageLabelsCountByPage[page, default: [:]] + uniquePageLabelsCount[pageLabel, default: 0] += 1 + uniquePageLabelsCountByPage[page] = uniquePageLabelsCount + } + var defaultPageLabelByPage: [Int: String] = [:] + for (page, uniquePageLabelsCount) in uniquePageLabelsCountByPage { + if let maxCount = uniquePageLabelsCount.values.max(), let defaultPageLabel = uniquePageLabelsCount.filter({ $0.value == maxCount }).keys.sorted().first { + defaultPageLabelByPage[page] = defaultPageLabel + } + } + let uniquePageOffsets = Set(defaultPageLabelByPage.map({ (page, pageLabel) in Int(pageLabel).flatMap({ $0 - page }) })) + if uniquePageOffsets.count == 1, let uniquePageOffset = uniquePageOffsets.first, let commonPageOffset = uniquePageOffset { + return .commonPageOffset(offset: commonPageOffset) + } + if !defaultPageLabelByPage.isEmpty { + return .labelPerPage(labelsByPage: defaultPageLabelByPage) + } + return .commonPageOffset(offset: 1) + } + private func loadSupportedAndLockUnsupportedAnnotations( from document: PSPDFKit.Document, key: String, @@ -2151,6 +2183,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi library: library, username: username, displayName: displayName, + defaultPageLabel: nil, boundingBoxConverter: delegate ) else { continue } @@ -2179,6 +2212,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi var updatedPdfAnnotations: [(PSPDFKit.Annotation, PDFDatabaseAnnotation)] = [] var deletedPdfAnnotations: [PSPDFKit.Annotation] = [] var insertedPdfAnnotations: [PSPDFKit.Annotation] = [] + var shouldRecomputeDefaultAnnotationPageLabel = false // Check which annotations changed and update `Document` // Modifications are indexed by the previously observed items @@ -2224,6 +2258,12 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi } } + let newPageLabel = item.fields.filter(.key(FieldKeys.Item.Annotation.pageLabel)).first?.value + let oldPageaLabel = viewModel.state.databaseAnnotations[index].fields.filter(.key(FieldKeys.Item.Annotation.pageLabel)).first?.value + if newPageLabel != oldPageaLabel { + shouldRecomputeDefaultAnnotationPageLabel = true + } + guard item.changeType == .sync, let pdfAnnotation = viewModel.state.document.annotations(at: PageIndex(annotation.page)).first(where: { $0.key == key.key }) else { continue } DDLogInfo("PDFReaderActionHandler: update PDF annotation") @@ -2249,6 +2289,8 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi selectionDeleted = true } + shouldRecomputeDefaultAnnotationPageLabel = true + guard let oldAnnotation = PDFDatabaseAnnotation(item: databaseAnnotations[index]), let pdfAnnotation = viewModel.state.document.annotations(at: PageIndex(oldAnnotation.page)).first(where: { $0.key == oldAnnotation.key }) else { continue } @@ -2304,6 +2346,10 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi boundingBoxConverter: boundingBoxConverter ) insertedPdfAnnotations.append(pdfAnnotation) + if annotation.pageLabel != viewModel.state.defaultAnnotationPageLabel.label(for: annotation.page) { + shouldRecomputeDefaultAnnotationPageLabel = true + } + DDLogInfo("PDFReaderActionHandler: insert PDF annotation") } } @@ -2315,6 +2361,8 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi // Create new sorted keys by re-adding document keys let sortedKeys = createSortedKeys(fromDatabaseAnnotations: objects, documentAnnotations: viewModel.state.documentAnnotations) + let defaultAnnotationPageLabel = shouldRecomputeDefaultAnnotationPageLabel ? defaultAnnotationPageLabel(fromDatabaseAnnotations: objects) : nil + // Temporarily disable PDF notifications, because these changes were made by sync and they don't need to be translated back to the database pdfDisposeBag = DisposeBag() // Update annotations in `Document` @@ -2353,6 +2401,9 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi update(viewModel: viewModel) { state in // Update db annotations state.databaseAnnotations = objects.freeze() + if let defaultAnnotationPageLabel { + state.defaultAnnotationPageLabel = defaultAnnotationPageLabel + } state.texts = texts state.comments = comments state.changes = .annotations From 9b1f698202ce657a089e4312c985159c18e38736 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 6 Oct 2025 20:35:55 +0300 Subject: [PATCH 14/75] Show sciencedirect cloudflare challenge to user (#1181) * Check for cloudflare challenge on sciencedirect timeout * Improve BackgroundSessionDelegate --- ZShare/Controllers/RedirectWebViewHandler.swift | 13 ++++++++----- ZShare/ViewModels/ExtensionViewModel.swift | 6 +++++- .../Background Uploader/URLSessionCreator.swift | 6 +++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/ZShare/Controllers/RedirectWebViewHandler.swift b/ZShare/Controllers/RedirectWebViewHandler.swift index 8b05a43cf..4a442c106 100644 --- a/ZShare/Controllers/RedirectWebViewHandler.swift +++ b/ZShare/Controllers/RedirectWebViewHandler.swift @@ -28,7 +28,7 @@ final class RedirectWebViewHandler: NSObject { case webViewNil case invalidURL case extractionFailed - case timeout + case timeout(URL?) } private let initialUrl: URL @@ -38,6 +38,7 @@ final class RedirectWebViewHandler: NSObject { private weak var webView: WKWebView? private var completionHandler: RedirectWebViewCompletion? private var disposeBag: DisposeBag? + private var currentNavigationResponse: WKNavigationResponse? init(url: URL, timeoutPerRedirect timeout: RxTimeInterval, webView: WKWebView) { initialUrl = url @@ -64,7 +65,7 @@ final class RedirectWebViewHandler: NSObject { extension RedirectWebViewHandler: WKNavigationDelegate { func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { guard let mimeType = navigationResponse.response.mimeType else { - startTimer() + startTimer(for: navigationResponse) decisionHandler(.allow) return } @@ -93,19 +94,21 @@ extension RedirectWebViewHandler: WKNavigationDelegate { decisionHandler(.cancel) default: - startTimer() + startTimer(for: navigationResponse) decisionHandler(.allow) } - func startTimer() { + func startTimer(for navigationResponse: WKNavigationResponse) { let disposeBag = DisposeBag() self.disposeBag = disposeBag + currentNavigationResponse = navigationResponse Single.timer(timeout, scheduler: timerScheduler) .observe(on: MainScheduler.instance) .subscribe(onSuccess: { [weak self] _ in DDLogInfo("RedirectWebViewHandler: redirection timed out") - self?.completionHandler?(.failure(.timeout)) + guard let self else { return } + completionHandler?(.failure(.timeout(currentNavigationResponse?.response.url))) }) .disposed(by: disposeBag) } diff --git a/ZShare/ViewModels/ExtensionViewModel.swift b/ZShare/ViewModels/ExtensionViewModel.swift index b18c16614..4358defb6 100644 --- a/ZShare/ViewModels/ExtensionViewModel.swift +++ b/ZShare/ViewModels/ExtensionViewModel.swift @@ -875,7 +875,11 @@ final class ExtensionViewModel { case .failure(let error): switch error { - case .timeout: + case .timeout(let url): + if url?.host()?.lowercased() == "challenges.cloudflare.com" { + webView?.isHidden = false + return + } // Check if there is a captcha, in order to show the web view. let captchaLocator = ".challenge-form" let javascript = "document.querySelector('\(captchaLocator)') !== null" diff --git a/Zotero/Controllers/Background Uploader/URLSessionCreator.swift b/Zotero/Controllers/Background Uploader/URLSessionCreator.swift index 66ac30df7..1215b9313 100644 --- a/Zotero/Controllers/Background Uploader/URLSessionCreator.swift +++ b/Zotero/Controllers/Background Uploader/URLSessionCreator.swift @@ -56,7 +56,11 @@ extension BackgroundSessionDelegate: URLSessionTaskDelegate { didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping @Sendable (URLSession.AuthChallengeDisposition, URLCredential?) -> Void ) { - forwardingTaskDelegate?.urlSession?(session, task: task, didReceive: challenge, completionHandler: completionHandler) + guard let forwardingTaskDelegate, forwardingTaskDelegate.responds(to: #selector(URLSessionTaskDelegate.urlSession(_:task:didReceive:completionHandler:))) else { + completionHandler(.performDefaultHandling, nil) + return + } + forwardingTaskDelegate.urlSession?(session, task: task, didReceive: challenge, completionHandler: completionHandler) } func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Swift.Error?) { From 5004706cdbeda2c3784d78b1e6894f1f40223d41 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 7 Oct 2025 15:04:49 +0300 Subject: [PATCH 15/75] Improve item count observation (#1182) * Improve item count observation * Improve collection changes observation * Update items count when items changes occur if needed * Improve code --- .../Requests/ReadItemsDbRequest.swift | 12 ++ Zotero/Models/Predicates.swift | 6 + .../Collections/Models/CollectionsState.swift | 9 +- .../ViewModels/CollectionsActionHandler.swift | 119 ++++++++++++++---- 4 files changed, 115 insertions(+), 31 deletions(-) diff --git a/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift index 5f86ebc25..f0319ae60 100644 --- a/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift @@ -77,3 +77,15 @@ struct ReadItemsWithKeysDbRequest: DbResponseRequest { return database.objects(RItem.self).filter(.keys(keys, in: libraryId)) } } + +struct ReadLibraryItemsDbRequest: DbResponseRequest { + typealias Response = Results + + let libraryId: LibraryIdentifier + + var needsWrite: Bool { return false } + + func process(in database: Realm) throws -> Results { + return database.objects(RItem.self).filter(.items(for: libraryId)) + } +} diff --git a/Zotero/Models/Predicates.swift b/Zotero/Models/Predicates.swift index f90f7c737..703282637 100644 --- a/Zotero/Models/Predicates.swift +++ b/Zotero/Models/Predicates.swift @@ -228,6 +228,12 @@ extension NSPredicate { return predicates } + static func items(for libraryId: LibraryIdentifier) -> NSPredicate { + var predicates: [NSPredicate] = [.library(with: libraryId), .notSyncState(.dirty), .deleted(false)] + predicates.append(NSPredicate(format: "parent = nil")) + return NSCompoundPredicate(andPredicateWithSubpredicates: predicates) + } + static func items(for collectionId: CollectionIdentifier, libraryId: LibraryIdentifier) -> NSPredicate { var predicates = self.baseItemPredicates(isTrash: collectionId.isTrash, libraryId: libraryId) diff --git a/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift b/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift index 1895b0327..1b79f70c5 100644 --- a/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift +++ b/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift @@ -41,10 +41,11 @@ struct CollectionsState: ViewModelState { var changes: Changes var collectionsToken: NotificationToken? var searchesToken: NotificationToken? - var itemsToken: NotificationToken? - var unfiledToken: NotificationToken? - var trashItemsToken: NotificationToken? - var trashCollectionsToken: NotificationToken? + var allItemsCountToken: NotificationToken? + var unfiledItemsCountToken: NotificationToken? + var trashItemsCountToken: NotificationToken? + var trashCollectionsCountToken: NotificationToken? + var itemsChangesToken: NotificationToken? var error: CollectionsError? // Used when user wants to create bibliography from whole collection. var itemKeysForBibliography: Swift.Result, Error>? diff --git a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift index 55b36b5b8..590e86fe2 100644 --- a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift +++ b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift @@ -207,41 +207,46 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces } }) - var allItemCount = 0 - var unfiledItemCount = 0 - var trashItemCount = 0 - var itemsToken: NotificationToken? - var unfiledToken: NotificationToken? - var trashItemsToken: NotificationToken? - var trashCollectionsToken: NotificationToken? + var allItemsCount = 0 + var unfiledItemsCount = 0 + var trashItemsCount = 0 + var allItemsCountToken: NotificationToken? + var unfiledItemsCountToken: NotificationToken? + var trashItemsCountToken: NotificationToken? + var trashCollectionsCountToken: NotificationToken? + var itemsChangesToken: NotificationToken? if includeItemCounts { let allItems = try coordinator.perform(request: ReadItemsDbRequest(collectionId: .custom(.all), libraryId: libraryId)) - allItemCount = allItems.count + allItemsCount = allItems.count let unfiledItems = try coordinator.perform(request: ReadItemsDbRequest(collectionId: .custom(.unfiled), libraryId: libraryId)) - unfiledItemCount = unfiledItems.count + unfiledItemsCount = unfiledItems.count let trashItems = try coordinator.perform(request: ReadItemsDbRequest(collectionId: .custom(.trash), libraryId: libraryId)) let trashCollections = try coordinator.perform(request: ReadCollectionsDbRequest(libraryId: libraryId, trash: true)) - trashItemCount = trashItems.count + trashCollections.count + trashItemsCount = trashItems.count + trashCollections.count - itemsToken = observeItemCount(in: allItems, for: .all, in: viewModel, handler: self) - unfiledToken = observeItemCount(in: unfiledItems, for: .unfiled, in: viewModel, handler: self) - trashItemsToken = observeItemCount(in: trashItems, for: .trash, in: viewModel, handler: self) - trashCollectionsToken = observeTrashedCollectionCount(in: trashCollections, in: viewModel, handler: self) + allItemsCountToken = observeItemCount(in: allItems, for: .all, in: viewModel, handler: self) + unfiledItemsCountToken = observeItemCount(in: unfiledItems, for: .unfiled, in: viewModel, handler: self) + trashItemsCountToken = observeItemCount(in: trashItems, for: .trash, in: viewModel, handler: self) + trashCollectionsCountToken = observeTrashedCollectionCount(in: trashCollections, in: viewModel, handler: self) + + let libraryItems = try coordinator.perform(request: ReadLibraryItemsDbRequest(libraryId: libraryId)) + itemsChangesToken = observeItemsChanges(in: libraryItems, in: viewModel, handler: self) } let collectionTree = CollectionTreeBuilder.collections(from: collections, libraryId: libraryId, includeItemCounts: includeItemCounts) - collectionTree.insert(collection: Collection(custom: .all, itemCount: allItemCount), at: 0) - collectionTree.append(collection: Collection(custom: .unfiled, itemCount: unfiledItemCount)) - collectionTree.append(collection: Collection(custom: .trash, itemCount: trashItemCount)) + collectionTree.insert(collection: Collection(custom: .all, itemCount: allItemsCount), at: 0) + collectionTree.append(collection: Collection(custom: .unfiled, itemCount: unfiledItemsCount)) + collectionTree.append(collection: Collection(custom: .trash, itemCount: trashItemsCount)) let collectionsToken = collections.observe(keyPaths: RCollection.observableKeypathsForList, { [weak self, weak viewModel] changes in guard let self, let viewModel else { return } switch changes { case .update(let objects, _, _, _): - updateCollections(with: objects, includeItemCounts: includeItemCounts, viewModel: viewModel) + let frozenObjects = objects.freeze() + updateCollections(with: frozenObjects, includeItemCounts: includeItemCounts, in: viewModel, handler: self) case .initial, .error: break @@ -253,10 +258,11 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces state.library = library state.libraryToken = libraryToken state.collectionsToken = collectionsToken - state.itemsToken = itemsToken - state.unfiledToken = unfiledToken - state.trashItemsToken = trashItemsToken - state.trashCollectionsToken = trashCollectionsToken + state.allItemsCountToken = allItemsCountToken + state.unfiledItemsCountToken = unfiledItemsCountToken + state.trashItemsCountToken = trashItemsCountToken + state.trashCollectionsCountToken = trashCollectionsCountToken + state.itemsChangesToken = itemsChangesToken } }) } catch let error { @@ -276,12 +282,13 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces guard let handler, let viewModel else { return } switch changes { case .update(let objects, _, _, _): + let itemsCount = objects.count switch customType { case .trash: - updateTrashCount(itemsCount: objects.count, collectionsCount: nil, in: viewModel, handler: handler) + updateTrashCount(itemsCount: itemsCount, collectionsCount: nil, in: viewModel, handler: handler) case .all, .publications, .unfiled: - updateItemsCount(objects.count, for: customType, in: viewModel, handler: handler) + updateItemsCount(itemsCount, for: customType, in: viewModel, handler: handler) } case .initial: @@ -318,7 +325,34 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces guard let handler, let viewModel else { return } switch changes { case .update(let objects, _, _, _): - updateTrashCount(itemsCount: nil, collectionsCount: objects.count, in: viewModel, handler: handler) + let collectionsCount = objects.count + updateTrashCount(itemsCount: nil, collectionsCount: collectionsCount, in: viewModel, handler: handler) + + case .initial: + break + + case .error: + break + } + }) + } + + func observeItemsChanges(in results: Results, in viewModel: ViewModel, handler: CollectionsActionHandler) -> NotificationToken { + return results.observe(keyPaths: ["trash", "deleted"], { [weak handler, weak viewModel] changes in + guard let handler, let viewModel else { return } + switch changes { + case .update(let objects, _, _, let modifications): + guard !modifications.isEmpty else { return } + let frozenObjects = objects.freeze() + var affectedCollectionKeys: Set = [] + for index in modifications { + let item = frozenObjects[index] + for collection in item.collections { + affectedCollectionKeys.insert(collection.key) + } + } + guard !affectedCollectionKeys.isEmpty else { return } + refreshCollectionItemCounts(for: affectedCollectionKeys, in: viewModel, handler: handler) case .initial: break @@ -327,6 +361,37 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces break } }) + + func refreshCollectionItemCounts(for collectionKeys: Set, in viewModel: ViewModel, handler: CollectionsActionHandler) { + guard !collectionKeys.isEmpty else { return } + var counts: [String: Int] = [:] + for key in collectionKeys { + let request = ReadItemsDbRequest(collectionId: .collection(key), libraryId: viewModel.state.library.identifier) + do { + let results = try handler.dbStorage.perform(request: request, on: .main) + let resultsCount = results.count + counts[key] = resultsCount + } catch { + DDLogError("CollectionsActionHandler: failed to refresh count for collection \(key) - \(error)") + } + } + guard !counts.isEmpty else { return } + handler.update(viewModel: viewModel) { state in + // state.collectionTree is a class instance, so changes are performed within the update block for consistency. + var didUpdate = false + for (key, count) in counts { + let identifier = CollectionIdentifier.collection(key) + guard let collection = state.collectionTree.collection(for: identifier) else { continue } + if collection.itemCount != count { + state.collectionTree.update(collection: collection.copy(with: count)) + didUpdate = true + } + } + if didUpdate { + state.changes = .results + } + } + } } func updateTrashCount(itemsCount: Int?, collectionsCount: Int?, in viewModel: ViewModel, handler: CollectionsActionHandler) { @@ -347,10 +412,10 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces } } - func updateCollections(with collections: Results, includeItemCounts: Bool, viewModel: ViewModel) { + func updateCollections(with collections: Results, includeItemCounts: Bool, in viewModel: ViewModel, handler: CollectionsActionHandler) { let tree = CollectionTreeBuilder.collections(from: collections, libraryId: viewModel.state.library.identifier, includeItemCounts: includeItemCounts) - update(viewModel: viewModel) { state in + handler.update(viewModel: viewModel) { state in state.collectionTree.replace(identifiersMatching: { $0.isCollection }, with: tree) state.changes = .results From 571dddd1a611fcd81395585ab304678c08daeffb Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 8 Oct 2025 12:34:35 +0300 Subject: [PATCH 16/75] Improve note editor action handler updates (#1183) --- .../ViewModels/NoteEditorActionHandler.swift | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift b/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift index f0f68ecda..d64867440 100644 --- a/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift +++ b/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift @@ -70,6 +70,11 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc } } + private func updateInMainThreadIfNeeded(viewModel: ViewModel, notifyListeners: Bool = true, action: @escaping (inout State) -> Void) { + inMainThread { + update(viewModel: viewModel, notifyListeners: notifyListeners, action: action) + } + } private func importImages(data: [String: Any], in viewModel: ViewModel) { guard !viewModel.state.kind.readOnly, let rawImages = data["images"] as? [[String: Any]] else { return } @@ -120,13 +125,13 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc let failedKeys = try dbStorage.perform(request: request, on: backgroundQueue).1.map({ $0.0 }) let successfulImages = images.filter({ !failedKeys.contains($0.1.key) }).map({ NoteEditorState.CreatedImage(nodeId: $0.0, key: $0.1.key) }) DDLogInfo("NoteEditorActionHandler: successfully created \(successfulImages)") - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.createdImages = successfulImages state.changes = .shouldSave } } catch let error { DDLogError("NoteEditorActionHandler: can't create embedded images - \(error)") - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.error = error } } @@ -150,7 +155,7 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc do { _ = try dbStorage.perform(request: request, on: backgroundQueue) - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.kind = .edit(key: note.key) updateTitleIfNeeded(title: note.title, state: &state) state.changes = [.kind, .saved] @@ -158,7 +163,7 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc return note.key } catch let error { DDLogError("NoteEditorActionHandler: can't create item note for added image: \(error)") - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.error = error } return nil @@ -204,7 +209,7 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc } DDLogInfo("NoteEditorActionHandler: loaded resource \(identifier); \(file.relativeComponents.joined(separator: "; "))") let resource = NoteEditorState.Resource(identifier: identifier, data: ["src": "data:\(file.mimeType);base64,\(dataString)"]) - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.downloadedResource = resource } } catch let error { @@ -263,7 +268,7 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc perform(request: request, invalidateRealm: true) { result in switch result { case .success: - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.kind = .edit(key: note.key) state.changes = [.kind, .saved] updateTitleIfNeeded(title: note.title, state: &state) @@ -284,7 +289,7 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc DDLogError("NoteEditorActionHandler: can't update existing note: \(error)") store(error: error, key: key) } else { - update(viewModel: viewModel) { state in + updateInMainThreadIfNeeded(viewModel: viewModel) { state in state.changes = .saved updateTitleIfNeeded(title: note.title, state: &state) } From d47c726810646c0855c3fea82000fece6c490915 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sun, 12 Oct 2025 11:37:53 +0300 Subject: [PATCH 17/75] Fix PDF reader top anchor for iOS 26 (#1184) --- .../Detail/PDF/Views/PDFDocumentViewController.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift index 10f8c3df5..fca387227 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFDocumentViewController.swift @@ -596,10 +596,18 @@ final class PDFDocumentViewController: UIViewController { NSLayoutConstraint.activate([ pdfController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), - pdfController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), pdfController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), pdfController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor) ]) + if #available(iOS 26.0.0, *) { + NSLayoutConstraint.activate([ + pdfController.view.topAnchor.constraint(equalTo: view.topAnchor) + ]) + } else { + NSLayoutConstraint.activate([ + pdfController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor) + ]) + } self.pdfController = pdfController From 7e5db00941e146d0477c91cd4cfec2cf829e639a Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sun, 12 Oct 2025 11:47:58 +0300 Subject: [PATCH 18/75] Fix CollectionsActionHandler items changes observation --- .../Collections/ViewModels/CollectionsActionHandler.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift index 590e86fe2..641630f61 100644 --- a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift +++ b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift @@ -341,11 +341,12 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces return results.observe(keyPaths: ["trash", "deleted"], { [weak handler, weak viewModel] changes in guard let handler, let viewModel else { return } switch changes { - case .update(let objects, _, _, let modifications): - guard !modifications.isEmpty else { return } + case .update(let objects, let deletions, let insertions, let modifications): + let correctedModifications = Database.correctedModifications(from: modifications, insertions: insertions, deletions: deletions) + guard !correctedModifications.isEmpty else { return } let frozenObjects = objects.freeze() var affectedCollectionKeys: Set = [] - for index in modifications { + for index in correctedModifications { let item = frozenObjects[index] for collection in item.collections { affectedCollectionKeys.insert(collection.key) From 17bef83aaadae905eacfcda4fa918c5ff8bcefe2 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 22 Jul 2025 18:27:39 +0300 Subject: [PATCH 19/75] Bump project iOS deployment target --- Zotero.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 854a277bb..7d5643c80 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -6297,7 +6297,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -6358,7 +6358,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -6684,7 +6684,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; From c16286b8adec60fc67d75516939e75f4ac71e880 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 23 Jul 2025 14:06:27 +0300 Subject: [PATCH 20/75] Fix PDFAnnotationsViewController setupToolbar regression --- .../Detail/PDF/Views/PDFAnnotationsViewController.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift index 299752388..7268a2d26 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFAnnotationsViewController.swift @@ -31,6 +31,7 @@ final class PDFAnnotationsViewController: UIViewController { private weak var mergeBarButton: UIBarButtonItem? private var dataSource: TableViewDiffableDataSource! private var searchController: UISearchController! + private var didAppear = false weak var parentDelegate: (PDFReaderContainerDelegate & PDFSidebarDelegate & ReaderAnnotationsDelegate)? weak var coordinatorDelegate: PdfAnnotationsCoordinatorDelegate? @@ -69,6 +70,10 @@ final class PDFAnnotationsViewController: UIViewController { tableView.selectRow(at: indexPath, animated: false, scrollPosition: .middle) } + if !didAppear { + didAppear = true + setupToolbar(to: viewModel.state) + } viewModel.stateObservable .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] state in From f31533f7700b757d359bacd249bcaf03a1a1ef4f Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 17 Oct 2025 11:41:47 +0300 Subject: [PATCH 21/75] Fix title and filename of PDF attachments added to an item (#1187) * Fix title and filename of first PDF attachment added to an item * Validate file name if using item title for attachment * Check for added attachments count before checking for first PDF filename * Prefer item baseTitle instead of displayTitle for attachment filename * Use filename without extension for added file title * Rename and move file of single moved attachment to parent if sole PDF * Improve code * Improve code * Cleanup unused code * Improve code --- .../Controllers/Architecture/ViewModel.swift | 22 +++++++++ Zotero/Controllers/AttachmentCreator.swift | 4 +- Zotero/Controllers/Database/DbStorage.swift | 1 + .../Controllers/Database/RealmDbStorage.swift | 13 ++++++ .../Requests/EditItemFieldsDbRequest.swift | 21 +++++++++ .../Requests/ReadFilenameDbRequest.swift | 2 +- .../ViewModels/ItemDetailActionHandler.swift | 32 +++++++++---- .../Items/ViewModels/ItemsActionHandler.swift | 45 ++++++++++++++++--- 8 files changed, 123 insertions(+), 17 deletions(-) diff --git a/Zotero/Controllers/Architecture/ViewModel.swift b/Zotero/Controllers/Architecture/ViewModel.swift index 35a86f4b3..382ece097 100644 --- a/Zotero/Controllers/Architecture/ViewModel.swift +++ b/Zotero/Controllers/Architecture/ViewModel.swift @@ -44,6 +44,13 @@ protocol BackgroundDbProcessingActionHandler { /// - parameter invalidateRealm: Indicates whether realm should be invalidated after use. /// - parameter completion: Handler called after db request is performed. Contains result with request response. Always called on main thread. func perform(request: Request, invalidateRealm: Bool, completion: @escaping (Result) -> Void) + + /// Performs database request in background. + /// - parameter refreshRealm: Indicates whether realm should be refreshed before use. + /// - parameter invalidateRealm: Indicates whether realm should be invalidated after use. + /// - parameter coordinatorAction: Closure of coordinated database actions. + /// - parameter completion: Handler called after db request is performed. Contains error if any. Always called on main thread. + func perform(refreshRealm: Bool, invalidateRealm: Bool, with coordinatorAction: @escaping (DbCoordinator) throws -> Void, completion: @escaping (Result) -> Void) throws } extension BackgroundDbProcessingActionHandler { @@ -94,6 +101,21 @@ extension BackgroundDbProcessingActionHandler { } } } + + func perform(refreshRealm: Bool = false, invalidateRealm: Bool = false, with coordinatorAction: @escaping (DbCoordinator) throws -> Void, completion: @escaping (Result) -> Void) { + backgroundQueue.async { + do { + try dbStorage.perform(on: backgroundQueue, refreshRealm: refreshRealm, invalidateRealm: invalidateRealm, with: coordinatorAction) + DispatchQueue.main.async { + completion(.success(())) + } + } catch let error { + DispatchQueue.main.async { + completion(.failure(error)) + } + } + } + } } final class ViewModel: ObservableObject { diff --git a/Zotero/Controllers/AttachmentCreator.swift b/Zotero/Controllers/AttachmentCreator.swift index 5552b06ec..108098a55 100644 --- a/Zotero/Controllers/AttachmentCreator.swift +++ b/Zotero/Controllers/AttachmentCreator.swift @@ -272,9 +272,9 @@ struct AttachmentCreator { return filename } if let ext = ext { - return item.displayTitle + "." + ext + return item.baseTitle + "." + ext } - return item.displayTitle + return item.baseTitle } static func contentType(for item: RItem) -> String? { diff --git a/Zotero/Controllers/Database/DbStorage.swift b/Zotero/Controllers/Database/DbStorage.swift index 266592756..dc91087da 100644 --- a/Zotero/Controllers/Database/DbStorage.swift +++ b/Zotero/Controllers/Database/DbStorage.swift @@ -39,6 +39,7 @@ protocol DbResponseRequest { protocol DbStorage: AnyObject { func perform(on queue: DispatchQueue, with coordinatorAction: (DbCoordinator) throws -> Void) throws + func perform(on queue: DispatchQueue, refreshRealm: Bool, invalidateRealm: Bool, with coordinatorAction: (DbCoordinator) throws -> Void) throws func perform(request: Request, on queue: DispatchQueue) throws -> Request.Response where Request: DbResponseRequest func perform(request: Request, on queue: DispatchQueue, refreshRealm: Bool) throws -> Request.Response where Request: DbResponseRequest func perform(request: Request, on queue: DispatchQueue, invalidateRealm: Bool) throws -> Request.Response where Request: DbResponseRequest diff --git a/Zotero/Controllers/Database/RealmDbStorage.swift b/Zotero/Controllers/Database/RealmDbStorage.swift index 1b73e89ec..1f601d16a 100644 --- a/Zotero/Controllers/Database/RealmDbStorage.swift +++ b/Zotero/Controllers/Database/RealmDbStorage.swift @@ -49,6 +49,19 @@ extension RealmDbStorage: DbStorage { } } + func perform(on queue: DispatchQueue, refreshRealm: Bool, invalidateRealm: Bool, with coordinatorAction: (DbCoordinator) throws -> Void) throws { + try self.performInAutoreleasepoolIfNeeded { + let coordinator = try RealmDbCoordinator(configuration: config, queue: queue) + if refreshRealm { + coordinator.refresh() + } + try coordinatorAction(coordinator) + if invalidateRealm { + coordinator.invalidate() + } + } + } + func perform(request: Request, on queue: DispatchQueue) throws -> Request.Response where Request: DbResponseRequest { return try self.perform(request: request, on: queue, invalidateRealm: false, refreshRealm: false) } diff --git a/Zotero/Controllers/Database/Requests/EditItemFieldsDbRequest.swift b/Zotero/Controllers/Database/Requests/EditItemFieldsDbRequest.swift index 9d293079b..3e28e6bbb 100644 --- a/Zotero/Controllers/Database/Requests/EditItemFieldsDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/EditItemFieldsDbRequest.swift @@ -96,3 +96,24 @@ struct EditItemFieldsDbResponseRequest: EditItemFieldsBaseRequest, DbResponseReq return try processAndReturnResponse(in: database) } } + +struct EditItemTitleDbRequest: DbRequest { + let key: String + let libraryId: LibraryIdentifier + let titleKeyPair: KeyBaseKeyPair + let title: String + + var needsWrite: Bool { return true } + + func process(in database: Realm) throws { + guard let item = database.objects(RItem.self).uniqueObject(key: key, libraryId: libraryId) else { return } + let filter: NSPredicate = titleKeyPair.baseKey.flatMap({ .key(titleKeyPair.key, andBaseKey: $0) }) ?? .key(titleKeyPair.key) + guard let field = item.fields.filter(filter).first, title != field.value else { return } + field.value = title + field.changed = true + item.set(title: field.value) + item.changes.append(RObjectChange.create(changes: RItemChanges.fields)) + item.changeType = .user + item.dateModified = Date() + } +} diff --git a/Zotero/Controllers/Database/Requests/ReadFilenameDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadFilenameDbRequest.swift index 199aa6814..2696157eb 100644 --- a/Zotero/Controllers/Database/Requests/ReadFilenameDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadFilenameDbRequest.swift @@ -31,6 +31,6 @@ struct ReadFilenameDbRequest: DbResponseRequest { return field.value } - return item.displayTitle + return item.baseTitle } } diff --git a/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift b/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift index 090a46dd1..61768748a 100644 --- a/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift @@ -486,7 +486,7 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess } private func addAttachments(from urls: [URL], in viewModel: ViewModel) { - self.createAttachments(from: urls, libraryId: viewModel.state.library.identifier) { [weak viewModel] attachments, failedCopyNames in + createAttachments(from: urls, in: viewModel) { [weak viewModel] attachments, failedCopyNames in guard let viewModel = viewModel else { return } if attachments.isEmpty { @@ -538,25 +538,41 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess } } - private func createAttachments(from urls: [URL], libraryId: LibraryIdentifier, completion: @escaping (([Attachment], [String])) -> Void) { - self.backgroundQueue.async { + private func createAttachments(from urls: [URL], in viewModel: ViewModel, completion: @escaping (([Attachment], [String])) -> Void) { + let libraryId = viewModel.state.library.identifier + let parentTitle = viewModel.state.data.title + let parentHasPDFAttachments = viewModel.state.attachments.contains { + guard case .file(_, let contentType, _, _, _) = $0.type, contentType == "application/pdf" else { return false } + return true + } + backgroundQueue.async { [weak self] in + guard let self else { return } var attachments: [Attachment] = [] var failedNames: [String] = [] for url in urls { - var name = url.deletingPathExtension().lastPathComponent - name = name.removingPercentEncoding ?? name + let nameWithExtension: String + let title: String let mimeType = url.pathExtension.mimeTypeFromExtension ?? "application/octet-stream" let key = KeyGenerator.newKey - let nameWithExtension = name + "." + url.pathExtension + if urls.count == 1, !parentHasPDFAttachments, mimeType == "application/pdf" { + nameWithExtension = FilenameFormatter.validate(filename: parentTitle) + "." + url.pathExtension + title = "PDF" + } else { + var name = url.deletingPathExtension().lastPathComponent + name = name.removingPercentEncoding ?? name + nameWithExtension = name + "." + url.pathExtension + title = name + } + let file = Files.attachmentFile(in: libraryId, key: key, filename: nameWithExtension, contentType: mimeType) do { - try self.fileStorage.move(from: url.path, to: file) + try fileStorage.move(from: url.path, to: file) attachments.append( Attachment( type: .file(filename: nameWithExtension, contentType: mimeType, location: .local, linkType: .importedFile, compressed: false), - title: nameWithExtension, + title: title, key: key, libraryId: libraryId ) diff --git a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift index 6aec21c54..69e96919a 100644 --- a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift +++ b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift @@ -392,11 +392,44 @@ final class ItemsActionHandler: BaseItemsActionHandler, ViewModelActionHandler { // MARK: - Drag & Drop private func moveItems(from keys: Set, to key: String, libraryId: LibraryIdentifier, completion: @escaping (Result) -> Void) { - let request = MoveItemsToParentDbRequest(itemKeys: keys, parentKey: key, libraryId: libraryId) - perform(request: request) { error in - guard let error else { return } - DDLogError("BaseItemsActionHandler: can't move items to parent: \(error)") - completion(.failure(.itemMove)) + perform(invalidateRealm: true) { [weak self] coordinator in + guard let self else { return } + try coordinator.perform(request: MoveItemsToParentDbRequest(itemKeys: keys, parentKey: key, libraryId: libraryId)) + guard keys.count == 1, let childKey = keys.first else { return } + // Only one attachment was added to the item, check if its new parent only has one PDF child, and if it is the one just added. + let parent = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) + let pdfChildren = parent.children.filter(.items(type: ItemTypes.attachment, notSyncState: .dirty, trash: false)).filter({ [weak self] in + guard let self, + let attachment = AttachmentCreator.attachment(for: $0, fileStorage: fileStorage, urlDetector: urlDetector), + case .file(_, let contentType, _, _, _) = attachment.type, + contentType == "application/pdf" + else { return false } + return true + }) + guard pdfChildren.count == 1, pdfChildren.first?.key == childKey, let titleKey = schemaController.titleKey(for: ItemTypes.attachment) else { return } + // Change attachment title to "PDF". + let keyPair = KeyBaseKeyPair(key: titleKey, baseKey: (titleKey != FieldKeys.Item.title ? FieldKeys.Item.title : nil)) + try coordinator.perform(request: EditItemTitleDbRequest(key: childKey, libraryId: libraryId, titleKeyPair: keyPair, title: "PDF")) + // Rename attachment filename to use parent title. + let newFilename = FilenameFormatter.validate(filename: parent.baseTitle) + ".pdf" + guard let change = try coordinator.perform( + request: RenameAttachmentFilenameDbRequest(key: childKey, libraryId: libraryId, filename: newFilename, contentType: "application/pdf", schemaController: schemaController) + ) else { return } + let oldFile = Files.attachmentFile(in: libraryId, key: change.key, filename: change.oldName, contentType: change.contentType) + guard fileStorage.has(oldFile) else { return } + let newFile = Files.attachmentFile(in: libraryId, key: change.key, filename: change.newName, contentType: change.contentType) + try fileStorage.move(from: oldFile, to: newFile) + } completion: { result in + switch result { + case .success: + completion(.success(())) + + case .failure(let error): + DDLogError("BaseItemsActionHandler: can't move items to parent: \(error)") + DispatchQueue.main.async { + completion(.failure(.itemMove)) + } + } } } @@ -491,7 +524,7 @@ final class ItemsActionHandler: BaseItemsActionHandler, ViewModelActionHandler { attachments.append( Attachment( type: .file(filename: filename, contentType: original.mimeType, location: .local, linkType: .importedFile, compressed: false), - title: filename, + title: original.name, key: key, libraryId: libraryId ) From 9063a22fc26a3ff4977a93f1b0213e8ed84201de Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 17 Oct 2025 12:01:23 +0300 Subject: [PATCH 22/75] Allow retrieve metadata for remote standalone PDFs (#1188) * Allow retrieve metadata for remote standalone PDF attachments * Simplify attachment file location handling for metadata retrieval --- .../Detail/Items/Views/ItemsViewController.swift | 13 ++++++++++++- .../Items/Views/RItemsTableViewDataSource.swift | 10 ++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift index f3544a0f1..78114b5fe 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift @@ -275,9 +275,20 @@ final class ItemsViewController: BaseItemsViewController { parentKey == nil, let file = attachment.file as? FileData, file.mimeType == "application/pdf", + attachment.location != nil, + let downloader = controllers.userControllers?.fileDownloader, let recognizerController = controllers.userControllers?.recognizerController else { return } - _ = recognizerController.queue(task: RecognizerController.Task(file: file, kind: .createParentForItem(libraryId: library.identifier, key: key))) + let libraryId = library.identifier + downloader.downloadIfNeeded(attachment: attachment, parentKey: nil) { [weak coordinatorDelegate] result in + switch result { + case .success: + _ = recognizerController.queue(task: RecognizerController.Task(file: file, kind: .createParentForItem(libraryId: libraryId, key: key))) + + case .failure(let error): + coordinatorDelegate?.showAttachmentError(error) + } + } case .duplicate: guard let key = selectedKeys.first else { return } diff --git a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift index 7ce310764..f48a7063b 100644 --- a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift +++ b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift @@ -148,14 +148,12 @@ extension RItemsTableViewDataSource: ItemsTableViewDataSource { // Add parent creation for standalone attachments if item.rawType == ItemTypes.attachment && item.parent == nil { - if attachment?.file?.mimeType == "application/pdf" { + if FeatureGates.enabled.contains(.pdfWorker), attachment?.file?.mimeType == "application/pdf" { switch location { - case .local, .localAndChangedRemotely: - if FeatureGates.enabled.contains(.pdfWorker) { - actions.append(ItemAction(type: .retrieveMetadata)) - } + case .local, .localAndChangedRemotely, .remote, .remoteMissing: + actions.append(ItemAction(type: .retrieveMetadata)) - case .none, .remote, .remoteMissing: + case .none: break } } From 55331a825158d4a27c020bcf2dd4445f087ec2aa Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 17 Oct 2025 12:04:18 +0300 Subject: [PATCH 23/75] Fix potential crashes (#1189) * Fix potential crash in RItemsTableViewDataSource * Fix potential crash when showing annotation popover * Fix potential crash in PDFReaderViewController.shareButton.getter --- .../Items/Views/RItemsTableViewDataSource.swift | 4 ++-- .../Detail/PDF/Views/PDFReaderViewController.swift | 6 +++--- Zotero/Scenes/Detail/ReaderCoordinator.swift | 14 +++++++++++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift index f48a7063b..715150210 100644 --- a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift +++ b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift @@ -40,8 +40,8 @@ extension RItem: ItemsTableViewObject { final class RItemsTableViewDataSource: NSObject { private unowned let viewModel: ViewModel private unowned let schemaController: SchemaController - private unowned let fileDownloader: AttachmentDownloader? - private unowned let recognizerController: RecognizerController? + private weak var fileDownloader: AttachmentDownloader? + private weak var recognizerController: RecognizerController? private var snapshot: Results? weak var handler: ItemsTableViewHandler? diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index 0f392eb7b..a640ee228 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -67,8 +67,6 @@ class PDFReaderViewController: UIViewController, ReaderViewController { weak var coordinatorDelegate: (PdfReaderCoordinatorDelegate & PdfAnnotationsCoordinatorDelegate)? private lazy var shareButton: UIBarButtonItem = { - var menuChildren: [UIMenuElement] = [] - let share = UIBarButtonItem(image: UIImage(systemName: "square.and.arrow.up"), style: .plain, target: nil, action: nil) share.accessibilityLabel = L10n.Accessibility.Pdf.share share.isEnabled = !viewModel.state.document.isLocked @@ -101,7 +99,9 @@ class PDFReaderViewController: UIViewController, ReaderViewController { exportOriginalPDFAction.accessibilityValue = L10n.Accessibility.Pdf.export elements.append(exportOriginalPDFAction) - if !viewModel.state.databaseAnnotations.isEmpty { + // viewModel.state.databaseAnnotations is accessed as an optional here (it is implicitly unwrapped), + // to avoid a the edge case where the user taps the share button before database annotations have finised loading, if too numerous. + if viewModel.state.databaseAnnotations?.isEmpty == false { let exportAnnotatedPDFAction = UIAction(title: L10n.Pdf.Export.exportAnnotated, image: .init(systemName: "square.and.arrow.up"), attributes: exportAttributes) { [weak self] _ in self?.viewModel.process(action: .export(includeAnnotations: true)) } diff --git a/Zotero/Scenes/Detail/ReaderCoordinator.swift b/Zotero/Scenes/Detail/ReaderCoordinator.swift index 339858d0d..a2428809a 100644 --- a/Zotero/Scenes/Detail/ReaderCoordinator.swift +++ b/Zotero/Scenes/Detail/ReaderCoordinator.swift @@ -225,9 +225,21 @@ extension ReaderCoordinator { coordinator.start(animated: false) if UIDevice.current.userInterfaceIdiom == .pad { + // Since iOS 18, crashes have been such as + // *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: + // 'CALayer position contains NaN: [219 nan]. Layer: >; sublayers = (, ); opaque = YES; anchorPoint = CGPoint (0.5 0.5); + // transform = CATransform3D (1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1); opacity = 1; animations = []>' + // Since the source rect has been computed from the annotation rect data, it's not impossible to get such a result. + // In this case, it is logged and the default CGNull is used instead, that will anchor the popover to the source view. + var safeSourceRect = sourceRect + if ![sourceRect.origin.x, sourceRect.origin.y, sourceRect.size.width, sourceRect.size.height].allSatisfy({ $0.isFinite && !$0.isNaN }) { + DDLogWarn("ReaderCoordinator: asked to show popover annotation using source rect \(sourceRect), using default CGNull insted") + safeSourceRect = .null + } navigationController.modalPresentationStyle = .popover navigationController.popoverPresentationController?.sourceView = currentNavigationController.view - navigationController.popoverPresentationController?.sourceRect = sourceRect + navigationController.popoverPresentationController?.sourceRect = safeSourceRect navigationController.popoverPresentationController?.permittedArrowDirections = [.left, .right] navigationController.popoverPresentationController?.delegate = popoverDelegate } From e9b25b672daf9bfb4581c1552e567667aeb29451 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 4 Nov 2025 13:46:09 +0200 Subject: [PATCH 24/75] Update SPM dependencies --- Zotero.xcodeproj/project.pbxproj | 14 +++++----- .../xcshareddata/swiftpm/Package.resolved | 28 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 7d5643c80..0efb0fd74 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -6888,7 +6888,7 @@ repositoryURL = "https://github.com/apple/swift-collections.git"; requirement = { kind = exactVersion; - version = 1.2.1; + version = 1.3.0; }; }; B3445F4426EF5EE9007D4009 /* XCRemoteSwiftPackageReference "plcrashreporter" */ = { @@ -6896,7 +6896,7 @@ repositoryURL = "https://github.com/microsoft/plcrashreporter"; requirement = { kind = exactVersion; - version = 1.11.3; + version = 1.12.0; }; }; B356A361252490B3003F1943 /* XCRemoteSwiftPackageReference "Alamofire" */ = { @@ -6936,7 +6936,7 @@ repositoryURL = "https://github.com/weichsel/ZIPFoundation"; requirement = { kind = exactVersion; - version = 0.9.19; + version = 0.9.20; }; }; B356A3882524A698003F1943 /* XCRemoteSwiftPackageReference "Nimble" */ = { @@ -6944,7 +6944,7 @@ repositoryURL = "https://github.com/Quick/Nimble"; requirement = { kind = exactVersion; - version = 13.7.1; + version = 13.8.0; }; }; B356A38E2524A6BA003F1943 /* XCRemoteSwiftPackageReference "Quick" */ = { @@ -6976,7 +6976,7 @@ repositoryURL = "https://github.com/realm/realm-swift"; requirement = { kind = exactVersion; - version = 10.54.5; + version = 10.54.6; }; }; B35E4B8B25248B3C000EA134 /* XCRemoteSwiftPackageReference "RxSwift" */ = { @@ -6984,7 +6984,7 @@ repositoryURL = "https://github.com/ReactiveX/RxSwift"; requirement = { kind = exactVersion; - version = 6.9.0; + version = 6.9.1; }; }; B3A6C59D252CA08200F24CBE /* XCRemoteSwiftPackageReference "PSPDFKit-SP" */ = { @@ -6992,7 +6992,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 26.0.0; + version = 26.1.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index facaab8b3..514d2e15f 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Quick/Nimble", "state" : { - "revision" : "7795df4fff1a9cd231fe4867ae54f4dc5f5734f9", - "version" : "13.7.1" + "revision" : "cc945f7bdf3b485adedc315e18685c065059b4ca", + "version" : "13.8.0" } }, { @@ -69,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/plcrashreporter", "state" : { - "revision" : "fec2ff791b27fd9b9ceab9072025dea56409cca1", - "version" : "1.11.3" + "revision" : "8c61e5e38e9f737dd68512ed1ea5ab081244ad65", + "version" : "1.12.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "4cdcc56c51b731908131a86c70fe76a9354e658e", - "version" : "26.0.0" + "revision" : "0408161215280f91eae85276108de47295811868", + "version" : "26.1.0" } }, { @@ -105,8 +105,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/realm/realm-swift", "state" : { - "revision" : "54eebd2b5e7a4a8055a7a8b55ac859a48462d722", - "version" : "10.54.5" + "revision" : "1c105d34f25af7851c5a3ff146be006de247a6b4", + "version" : "10.54.6" } }, { @@ -114,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/ReactiveX/RxSwift", "state" : { - "revision" : "5dd1907d64f0d36f158f61a466bab75067224893", - "version" : "6.9.0" + "revision" : "5004a18539bd68905c5939aa893075f578f4f03d", + "version" : "6.9.1" } }, { @@ -159,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "8c0c0a8b49e080e54e5e328cc552821ff07cd341", - "version" : "1.2.1" + "revision" : "7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e", + "version" : "1.3.0" } }, { @@ -195,8 +195,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/weichsel/ZIPFoundation", "state" : { - "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", - "version" : "0.9.19" + "revision" : "22787ffb59de99e5dc1fbfe80b19c97a904ad48d", + "version" : "0.9.20" } } ], From 09c41848837976b275d101e098e179ae4e5dfda4 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Thu, 6 Nov 2025 11:03:24 +0100 Subject: [PATCH 25/75] Updated translators & styles --- translators | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translators b/translators index a095751f8..6365ccdf1 160000 --- a/translators +++ b/translators @@ -1 +1 @@ -Subproject commit a095751f8af43a16461d4a3e162cdaf041ad725b +Subproject commit 6365ccdf1360a472ac2dc2a09e0b05c527d676dd From 342d2d42b3c4521d9a03e2e6c8ad32a5ccff4580 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Thu, 6 Nov 2025 11:05:17 +0100 Subject: [PATCH 26/75] Fixed epub initial cfi value (#1203) --- .../Database/Requests/ReadDocumentDataDbRequest.swift | 2 +- .../HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift index 2bc467651..2fa45e9ee 100644 --- a/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift @@ -19,7 +19,7 @@ struct ReadDocumentDataDbRequest: DbResponseRequest { var needsWrite: Bool { return false } func process(in database: Realm) throws -> String { - guard let pageIndex = database.objects(RPageIndex.self).uniqueObject(key: attachmentKey, libraryId: libraryId) else { return "0" } + guard let pageIndex = database.objects(RPageIndex.self).uniqueObject(key: attachmentKey, libraryId: libraryId) else { return "" } return pageIndex.index } } diff --git a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift index 775465a10..d14b872eb 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift @@ -812,10 +812,11 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro func loadTypeAndPage(from file: File, rawPage: String) throws -> (String, HtmlEpubReaderState.DocumentData.Page?) { switch viewModel.state.documentFile.ext.lowercased() { case "epub": - return ("epub", .epub(cfi: rawPage)) + let cfi = rawPage.isEmpty ? "_start" : rawPage + return ("epub", .epub(cfi: cfi)) case "html", "htm": - if let scrollYPercent = Double(rawPage) { + if let scrollYPercent = Double(rawPage.isEmpty ? "0" : rawPage) { return ("snapshot", .html(scrollYPercent: scrollYPercent)) } else { DDLogError("HtmlEPubReaderActionHandler: incompatible lastIndexPage stored for \(viewModel.state.key) - \(rawPage)") From 4e19f40def754f0b5d08b91d76882bf0d994f354 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 20 Nov 2025 16:44:13 +0200 Subject: [PATCH 27/75] Place intra document navigation buttons below sidebar for compact width --- .../Views/IntraDocumentNavigationButtonsHandler.swift | 10 ++++++++-- .../Detail/PDF/Views/PDFReaderViewController.swift | 6 +++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Zotero/Scenes/Detail/PDF/Views/IntraDocumentNavigationButtonsHandler.swift b/Zotero/Scenes/Detail/PDF/Views/IntraDocumentNavigationButtonsHandler.swift index 7c3b629d3..41eddd34a 100644 --- a/Zotero/Scenes/Detail/PDF/Views/IntraDocumentNavigationButtonsHandler.swift +++ b/Zotero/Scenes/Detail/PDF/Views/IntraDocumentNavigationButtonsHandler.swift @@ -10,6 +10,7 @@ import UIKit protocol IntraDocumentNavigationButtonsHandlerDelegate: AnyObject { var isCompactWidth: Bool { get } + var sidebarView: UIView? { get } } enum PageChange { @@ -74,8 +75,13 @@ final class IntraDocumentNavigationButtonsHandler { static private let disappearingDelay: DispatchTimeInterval = .milliseconds(3000) private func updateVisibility(pageChange: PageChange? = nil) { defer { - backButton.superview?.bringSubviewToFront(backButton) - forwardButton.superview?.bringSubviewToFront(forwardButton) + if let sidebarView = delegate.sidebarView { + backButton.superview?.insertSubview(backButton, belowSubview: sidebarView) + backButton.superview?.insertSubview(forwardButton, belowSubview: sidebarView) + } else { + backButton.superview?.bringSubviewToFront(backButton) + forwardButton.superview?.bringSubviewToFront(forwardButton) + } } if interfaceIsVisible || (!hasBackActions && !hasForwardActions) { resetBothDisappearingTimers() diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index a640ee228..697bb8d76 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -975,6 +975,10 @@ extension PDFReaderViewController: AnnotationBoundingBoxConverter { } } -extension PDFReaderViewController: IntraDocumentNavigationButtonsHandlerDelegate { } +extension PDFReaderViewController: IntraDocumentNavigationButtonsHandlerDelegate { + var sidebarView: UIView? { + return sidebarController?.view + } +} extension PDFReaderViewController: ParentWithSidebarController {} From 4622a67bbaec025ebc3648d874282c0db3ed9558 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 20 Nov 2025 17:30:29 +0200 Subject: [PATCH 28/75] Update SPM dependencies --- Zotero.xcodeproj/project.pbxproj | 4 ++-- .../xcshareddata/swiftpm/Package.resolved | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 0efb0fd74..f4c2c3784 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -6896,7 +6896,7 @@ repositoryURL = "https://github.com/microsoft/plcrashreporter"; requirement = { kind = exactVersion; - version = 1.12.0; + version = 1.12.2; }; }; B356A361252490B3003F1943 /* XCRemoteSwiftPackageReference "Alamofire" */ = { @@ -6992,7 +6992,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 26.1.0; + version = 26.2.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 514d2e15f..3c1794c8e 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -69,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/plcrashreporter", "state" : { - "revision" : "8c61e5e38e9f737dd68512ed1ea5ab081244ad65", - "version" : "1.12.0" + "revision" : "0254f941c646b1ed17b243654723d0f071e990d0", + "version" : "1.12.2" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "0408161215280f91eae85276108de47295811868", - "version" : "26.1.0" + "revision" : "3300eced9885b3c72176d1bbf600ce87c33ec881", + "version" : "26.2.0" } }, { From 112b122e36d6b11919c05e3e1fa3356ac4c49d67 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 24 Nov 2025 13:11:59 +0200 Subject: [PATCH 29/75] Fix bugs (#1209) * Fix potential ItemsActionHandler apply settings crash * Fix potential CollectionsActionHandler update trash count crash * Fix potential ItemsViewController observation update crash --- .../Items/ViewModels/ItemsActionHandler.swift | 29 +++++++++++------ .../Items/Views/ItemsViewController.swift | 5 +-- .../Collections/Models/CollectionsState.swift | 6 +++- .../ViewModels/CollectionsActionHandler.swift | 32 ++++++++++--------- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift index 69e96919a..e464f1f87 100644 --- a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift +++ b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift @@ -578,16 +578,25 @@ final class ItemsActionHandler: BaseItemsActionHandler, ViewModelActionHandler { // MARK: - Searching & Filtering private func applySettings(in viewModel: ViewModel) { - let results = try? results( - for: viewModel.state.searchTerm, - filters: viewModel.state.filters, - collectionId: viewModel.state.collection.identifier, - sortType: viewModel.state.sortType, - libraryId: viewModel.state.library.identifier - ) - update(viewModel: viewModel) { state in - state.results = results - state.changes = [.results] + let state = viewModel.state + do { + let results = try results( + for: state.searchTerm, + filters: state.filters, + collectionId: state.collection.identifier, + sortType: state.sortType, + libraryId: state.library.identifier + ) + update(viewModel: viewModel) { state in + state.results = results + state.changes = [.results] + } + } catch { + DDLogError("ItemsActionHandler: can't apply settings - \(error)") + update(viewModel: viewModel) { state in + state.results = nil + state.changes = [.results] + } } } diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift index 78114b5fe..51373811f 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift @@ -371,9 +371,10 @@ final class ItemsViewController: BaseItemsViewController { updateTagFilter(filters: viewModel.state.filters, collectionId: collection.identifier, libraryId: library.identifier) case .update(let results, let deletions, let insertions, let modifications): + let frozenResults = results.freeze() let correctedModifications = Database.correctedModifications(from: modifications, insertions: insertions, deletions: deletions) - viewModel.process(action: .updateKeys(items: results, deletions: deletions, insertions: insertions, modifications: correctedModifications)) - dataSource.apply(snapshot: results.freeze(), modifications: modifications, insertions: insertions, deletions: deletions) { [weak self] in + viewModel.process(action: .updateKeys(items: frozenResults, deletions: deletions, insertions: insertions, modifications: correctedModifications)) + dataSource.apply(snapshot: frozenResults, modifications: correctedModifications, insertions: insertions, deletions: deletions) { [weak self] in guard let self else { return } updateTagFilter(filters: viewModel.state.filters, collectionId: collection.identifier, libraryId: library.identifier) } diff --git a/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift b/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift index e6f0c1ac5..13165f0a0 100644 --- a/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift +++ b/Zotero/Scenes/Master/Collections/Models/CollectionsState.swift @@ -46,6 +46,8 @@ struct CollectionsState: ViewModelState { var trashItemsCountToken: NotificationToken? var trashCollectionsCountToken: NotificationToken? var itemsChangesToken: NotificationToken? + var cachedTrashItemsCount: Int + var cachedTrashCollectionsCount: Int var error: CollectionsError? // Used when user wants to create bibliography from whole collection. var itemKeysForBibliography: Swift.Result, Error>? @@ -54,7 +56,9 @@ struct CollectionsState: ViewModelState { self.selectedCollectionId = selectedCollectionId self.changes = [] self.collectionTree = CollectionTree(nodes: [], collections: [:], collapsed: [:]) - + self.cachedTrashItemsCount = 0 + self.cachedTrashCollectionsCount = 0 + switch libraryId { case .custom: library = Library(identifier: libraryId, name: L10n.Libraries.myLibrary, metadataEditable: true, filesEditable: true) diff --git a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift index 85474875a..6bfe479c7 100644 --- a/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift +++ b/Zotero/Scenes/Master/Collections/ViewModels/CollectionsActionHandler.swift @@ -213,7 +213,9 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces var allItemsCount = 0 var unfiledItemsCount = 0 // If not showing item counts, trashItemsCount is set to -1, in order for the trash icon to not be shown as empty. - var trashItemsCount = includeItemCounts ? 0 : -1 + var trashTotalCount = includeItemCounts ? 0 : -1 + var cachedTrashItemsCount = 0 + var cachedTrashCollectionsCount = 0 var allItemsCountToken: NotificationToken? var unfiledItemsCountToken: NotificationToken? var trashItemsCountToken: NotificationToken? @@ -229,7 +231,9 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces let trashItems = try coordinator.perform(request: ReadItemsDbRequest(collectionId: .custom(.trash), libraryId: libraryId)) let trashCollections = try coordinator.perform(request: ReadCollectionsDbRequest(libraryId: libraryId, trash: true)) - trashItemsCount = trashItems.count + trashCollections.count + trashTotalCount = trashItems.count + trashCollections.count + cachedTrashItemsCount = trashItems.count + cachedTrashCollectionsCount = trashCollections.count allItemsCountToken = observeItemCount(in: allItems, for: .all, in: viewModel, handler: self) unfiledItemsCountToken = observeItemCount(in: unfiledItems, for: .unfiled, in: viewModel, handler: self) @@ -243,7 +247,7 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces let collectionTree = CollectionTreeBuilder.collections(from: collections, libraryId: libraryId, includeItemCounts: includeItemCounts) collectionTree.insert(collection: Collection(custom: .all, itemCount: allItemsCount), at: 0) collectionTree.append(collection: Collection(custom: .unfiled, itemCount: unfiledItemsCount)) - collectionTree.append(collection: Collection(custom: .trash, itemCount: trashItemsCount)) + collectionTree.append(collection: Collection(custom: .trash, itemCount: trashTotalCount)) let collectionsToken = collections.observe(keyPaths: RCollection.observableKeypathsForList, { [weak self, weak viewModel] changes in guard let self, let viewModel else { return } @@ -267,6 +271,8 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces state.trashItemsCountToken = trashItemsCountToken state.trashCollectionsCountToken = trashCollectionsCountToken state.itemsChangesToken = itemsChangesToken + state.cachedTrashItemsCount = cachedTrashItemsCount + state.cachedTrashCollectionsCount = cachedTrashCollectionsCount } }) } catch let error { @@ -400,19 +406,15 @@ final class CollectionsActionHandler: ViewModelActionHandler, BackgroundDbProces } func updateTrashCount(itemsCount: Int?, collectionsCount: Int?, in viewModel: ViewModel, handler: CollectionsActionHandler) { - var count = 0 - if let itemsCount { - count += itemsCount - } else { - count += (try? handler.dbStorage.perform(request: ReadItemsDbRequest(collectionId: .custom(.trash), libraryId: libraryId), on: .main))?.count ?? 0 - } - if let collectionsCount { - count += collectionsCount - } else { - count += (try? handler.dbStorage.perform(request: ReadCollectionsDbRequest(libraryId: libraryId, trash: true), on: .main))?.count ?? 0 - } handler.update(viewModel: viewModel) { state in - state.collectionTree.update(collection: Collection(custom: .trash, itemCount: count)) + if let itemsCount { + state.cachedTrashItemsCount = itemsCount + } + if let collectionsCount { + state.cachedTrashCollectionsCount = collectionsCount + } + let totalCount = state.cachedTrashItemsCount + state.cachedTrashCollectionsCount + state.collectionTree.update(collection: Collection(custom: .trash, itemCount: totalCount)) state.changes = .trashItemCount } } From f4242b155230813331edd17d9c422c022363749e Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 24 Nov 2025 13:39:11 +0200 Subject: [PATCH 30/75] Fix share extension background upload delegate (#1207) * Fix share extension background upload delegate * Improve code * Remove unnecessary code --- .../AttachmentDownloader.swift | 8 +- .../BackgroundUploadObserver.swift | 18 ++-- .../BackgroundUploader.swift | 6 +- .../URLSessionCreator.swift | 93 +++++++++++++++---- 4 files changed, 91 insertions(+), 34 deletions(-) diff --git a/Zotero/Controllers/Attachment Downloader/AttachmentDownloader.swift b/Zotero/Controllers/Attachment Downloader/AttachmentDownloader.swift index 0c87ff781..21b2e8179 100644 --- a/Zotero/Controllers/Attachment Downloader/AttachmentDownloader.swift +++ b/Zotero/Controllers/Attachment Downloader/AttachmentDownloader.swift @@ -153,13 +153,7 @@ final class AttachmentDownloader: NSObject { let configuration = URLSessionConfiguration.default session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil) #else - session = URLSessionCreator.createSession( - for: Self.sessionId, - forwardingDelegate: self, - forwardingTaskDelegate: self, - forwardingDownloadDelegate: self, - httpMaximumConnectionsPerHost: Self.maxConcurrentDownloads - ) + session = URLSessionCreator.createDownloadSession(for: Self.sessionId, delegate: self, httpMaximumConnectionsPerHost: Self.maxConcurrentDownloads) session.getAllTasks { [weak self] tasks in guard let self else { return } let tasksGroupedByIdentifier = Dictionary(grouping: tasks, by: { $0.taskIdentifier }) diff --git a/Zotero/Controllers/Background Uploader/BackgroundUploadObserver.swift b/Zotero/Controllers/Background Uploader/BackgroundUploadObserver.swift index 62f21b055..d1dfa631b 100644 --- a/Zotero/Controllers/Background Uploader/BackgroundUploadObserver.swift +++ b/Zotero/Controllers/Background Uploader/BackgroundUploadObserver.swift @@ -132,8 +132,7 @@ final class BackgroundUploadObserver: NSObject { self.sessions[sessionId] = nil session.invalidateAndCancel() } else { - let session = URLSessionCreator.createSession(for: sessionId) - session.invalidateAndCancel() + URLSessionCreator.createSessionWithoutDelegate(for: sessionId).invalidateAndCancel() } } @@ -150,7 +149,7 @@ final class BackgroundUploadObserver: NSObject { DDLogInfo("BackgroundUploadObserver: start observing \(identifier)") - let session = URLSessionCreator.createSession(for: identifier, forwardingDelegate: self, forwardingTaskDelegate: self) + let session = URLSessionCreator.createTaskSession(for: identifier, delegate: self) self.sessions[identifier] = session } } @@ -195,15 +194,14 @@ final class BackgroundUploadObserver: NSObject { func handleEventsForBackgroundURLSession(with identifier: String, completionHandler: @escaping () -> Void) { DDLogInfo("BackgroundUploadObserver: handle events for background url session \(identifier)") self.completionHandlers[identifier] = completionHandler - let session = URLSessionCreator.createSession(for: identifier, forwardingDelegate: self, forwardingTaskDelegate: self) + let session = URLSessionCreator.createTaskSession(for: identifier, delegate: self) self.sessions[identifier] = session } func cancelAllUploads() { - for id in self.context.sessionIds { - guard self.sessions[id] == nil else { continue } - let session = URLSessionCreator.createSession(for: id, forwardingDelegate: self, forwardingTaskDelegate: self) - session.invalidateAndCancel() + for sessionId in self.context.sessionIds { + guard self.sessions[sessionId] == nil else { continue } + URLSessionCreator.createSessionWithoutDelegate(for: sessionId).invalidateAndCancel() } for (_, session) in self.sessions { @@ -277,6 +275,10 @@ extension BackgroundUploadObserver: URLSessionDelegate { self.context.deleteSession(with: sessionId) self.context.deleteShareExtensionSession(with: sessionId) } + + func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + completionHandler(.performDefaultHandling, nil) + } } extension BackgroundUploadObserver: URLSessionTaskDelegate { diff --git a/Zotero/Controllers/Background Uploader/BackgroundUploader.swift b/Zotero/Controllers/Background Uploader/BackgroundUploader.swift index 2945d763b..be6e5165d 100644 --- a/Zotero/Controllers/Background Uploader/BackgroundUploader.swift +++ b/Zotero/Controllers/Background Uploader/BackgroundUploader.swift @@ -30,7 +30,7 @@ final class BackgroundUploader { // MARK: - Actions - func start(upload: BackgroundUpload, filename: String, mimeType: String, parameters: [String: String], headers: [String: String], delegate: URLSessionTaskDelegate?) -> Single { + func start(upload: BackgroundUpload, filename: String, mimeType: String, parameters: [String: String], headers: [String: String], delegate: URLSessionTaskDelegate) -> Single { return self.requestProvider.createRequest(for: upload, filename: filename, mimeType: mimeType, parameters: parameters, headers: headers, schemaVersion: self.schemaVersion) .flatMap({ request, url, size -> Single<(URL, UInt64, URLRequest, URLSession)> in return self.createSession(delegate: delegate).flatMap({ Single.just((url, size, request, $0)) }) @@ -45,10 +45,10 @@ final class BackgroundUploader { }) } - private func createSession(delegate: URLSessionTaskDelegate?) -> Single { + private func createSession(delegate: URLSessionTaskDelegate) -> Single { return Single.create { [weak self] subscriber in let sessionId = UUID().uuidString - let session = URLSessionCreator.createSession(for: sessionId, forwardingDelegate: delegate, forwardingTaskDelegate: delegate) + let session = URLSession(configuration: URLSessionCreator.createBackgroundConfiguration(for: sessionId), delegate: delegate, delegateQueue: nil) self?.context.saveSession(with: sessionId) self?.context.saveShareExtensionSession(with: sessionId) subscriber(.success(session)) diff --git a/Zotero/Controllers/Background Uploader/URLSessionCreator.swift b/Zotero/Controllers/Background Uploader/URLSessionCreator.swift index 1215b9313..978635656 100644 --- a/Zotero/Controllers/Background Uploader/URLSessionCreator.swift +++ b/Zotero/Controllers/Background Uploader/URLSessionCreator.swift @@ -9,15 +9,11 @@ import Foundation final class URLSessionCreator { - static func createSession( + static func createBackgroundConfiguration( for identifier: String, - forwardingDelegate: URLSessionDelegate? = nil, - forwardingTaskDelegate: URLSessionTaskDelegate? = nil, - forwardingDownloadDelegate: URLSessionDownloadDelegate? = nil, - delegateQueue: OperationQueue? = nil, isDiscretionary: Bool = false, httpMaximumConnectionsPerHost: Int? = nil - ) -> URLSession { + ) -> URLSessionConfiguration { let configuration = URLSessionConfiguration.background(withIdentifier: identifier) configuration.sharedContainerIdentifier = AppGroup.identifier configuration.timeoutIntervalForRequest = ApiConstants.requestTimeout @@ -27,29 +23,77 @@ final class URLSessionCreator { if let httpMaximumConnectionsPerHost { configuration.httpMaximumConnectionsPerHost = httpMaximumConnectionsPerHost } - let session = URLSession(configuration: configuration, delegate: BackgroundSessionDelegate(), delegateQueue: delegateQueue) - if let backgroundSessionDelegate = session.delegate as? BackgroundSessionDelegate { - backgroundSessionDelegate.forwardingDelegate = forwardingDelegate - backgroundSessionDelegate.forwardingTaskDelegate = forwardingTaskDelegate - backgroundSessionDelegate.forwardingDownloadDelegate = forwardingDownloadDelegate - } - return session + return configuration + } + + static func createSessionWithoutDelegate(for identifier: String) -> URLSession { + return URLSession(configuration: createBackgroundConfiguration(for: identifier), delegate: nil, delegateQueue: nil) + } + + static func createSession(for identifier: String, delegate: URLSessionDelegate) -> URLSession { + return URLSession(configuration: createBackgroundConfiguration(for: identifier), delegate: BackgroundSessionDelegate(forwardingDelegate: delegate), delegateQueue: nil) + } + + static func createTaskSession(for identifier: String, delegate: URLSessionTaskDelegate) -> URLSession { + return URLSession(configuration: createBackgroundConfiguration(for: identifier), delegate: BackgroundSessionTaskDelegate(forwardingTaskDelegate: delegate), delegateQueue: nil) + } + + static func createDownloadSession(for identifier: String, delegate: URLSessionDownloadDelegate, httpMaximumConnectionsPerHost: Int) -> URLSession { + return URLSession( + configuration: createBackgroundConfiguration(for: identifier, httpMaximumConnectionsPerHost: httpMaximumConnectionsPerHost), + delegate: BackgroundSessionDownloadDelegate(forwardingDownloadDelegate: delegate), + delegateQueue: nil + ) } } -final class BackgroundSessionDelegate: NSObject { +class BackgroundSessionDelegate: NSObject { weak var forwardingDelegate: URLSessionDelegate? weak var forwardingTaskDelegate: URLSessionTaskDelegate? weak var forwardingDownloadDelegate: URLSessionDownloadDelegate? + + init(forwardingDelegate: URLSessionDelegate) { + self.forwardingDelegate = forwardingDelegate + } +} + +class BackgroundSessionTaskDelegate: BackgroundSessionDelegate { + init(forwardingTaskDelegate: URLSessionTaskDelegate) { + super.init(forwardingDelegate: forwardingTaskDelegate) + self.forwardingTaskDelegate = forwardingTaskDelegate + } +} + +class BackgroundSessionDownloadDelegate: BackgroundSessionTaskDelegate { + init(forwardingDownloadDelegate: URLSessionDownloadDelegate) { + super.init(forwardingTaskDelegate: forwardingDownloadDelegate) + self.forwardingDownloadDelegate = forwardingDownloadDelegate + } } extension BackgroundSessionDelegate: URLSessionDelegate { func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) { forwardingDelegate?.urlSessionDidFinishEvents?(forBackgroundURLSession: session) } + + func urlSession(_ session: URLSession, didBecomeInvalidWithError error: (any Error)?) { + forwardingDelegate?.urlSession?(session, didBecomeInvalidWithError: error) + } + + func urlSession( + _ session: URLSession, + didReceive challenge: URLAuthenticationChallenge, + completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void + ) { + guard let forwardingDelegate, forwardingDelegate.responds(to: #selector(URLSessionDelegate.urlSession(_:didReceive:completionHandler:))) else { + completionHandler(.performDefaultHandling, nil) + return + } + forwardingDelegate.urlSession?(session, didReceive: challenge, completionHandler: completionHandler) + } } -extension BackgroundSessionDelegate: URLSessionTaskDelegate { +extension BackgroundSessionTaskDelegate: URLSessionTaskDelegate { func urlSession( _ session: URLSession, task: URLSessionTask, @@ -66,9 +110,26 @@ extension BackgroundSessionDelegate: URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Swift.Error?) { forwardingTaskDelegate?.urlSession?(session, task: task, didCompleteWithError: error) } + + func urlSession( + _ session: URLSession, + task: URLSessionTask, + willBeginDelayedRequest request: URLRequest, + completionHandler: @escaping (URLSession.DelayedRequestDisposition, URLRequest?) -> Void + ) { + guard let forwardingTaskDelegate, forwardingTaskDelegate.responds(to: #selector(URLSessionTaskDelegate.urlSession(_:task:willBeginDelayedRequest:completionHandler:))) else { + completionHandler(.continueLoading, nil) + return + } + forwardingTaskDelegate.urlSession?(session, task: task, willBeginDelayedRequest: request, completionHandler: completionHandler) + } + + func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + forwardingTaskDelegate?.urlSession?(session, taskIsWaitingForConnectivity: task) + } } -extension BackgroundSessionDelegate: URLSessionDownloadDelegate { +extension BackgroundSessionDownloadDelegate: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { forwardingDownloadDelegate?.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) } From 9b05c54d717d54033cd75e8237b6baee23ea455f Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Tue, 25 Nov 2025 10:07:02 +0100 Subject: [PATCH 31/75] Possible fix for ArrayEncoding json serialization (#1211) --- Zotero/Controllers/API/ArrayEncoding.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Zotero/Controllers/API/ArrayEncoding.swift b/Zotero/Controllers/API/ArrayEncoding.swift index f83cc847a..e6efdbf12 100644 --- a/Zotero/Controllers/API/ArrayEncoding.swift +++ b/Zotero/Controllers/API/ArrayEncoding.swift @@ -52,10 +52,10 @@ struct ArrayEncoding: ParameterEncoding { guard let array = parameters[ArrayEncoding.arrayParametersKey] else { return urlRequest } - let tmpPath = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString).appendingPathExtension("json").path + let url = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString).appendingPathExtension("json") try safeWrite() - guard let inputStream = InputStream(fileAtPath: tmpPath) else { + guard let inputStream = InputStream(url: url) else { throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: ArrayEncodingError.cantCreateInputStream)) } @@ -71,7 +71,7 @@ struct ArrayEncoding: ParameterEncoding { var error: NSError? for attempt in 1...2 { - guard let outputStream = OutputStream(toFileAtPath: tmpPath, append: false) else { + guard let outputStream = OutputStream(url: url, append: false) else { throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: ArrayEncodingError.cantCreateOutputStream)) } @@ -86,6 +86,8 @@ struct ArrayEncoding: ParameterEncoding { DDLogError("ArrayEncoding: attempt \(attempt) serialization error - \(error). Stream status \(outputStream.streamStatus), error: \(outputStream.streamError as Any)") if attempt == 1 { + // Try creating empty file in given URL, because OutputStream can sometime fail if the file doesn't exist. + FileManager.default.createFile(atPath: url.path, contents: nil, attributes: nil) // Let's try again in a second to rule out cleanup of the temporary directory or other race conditions. Thread.sleep(forTimeInterval: 1) } From 068c21e1243edcddfc5806691fbafba84d7c7bb1 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Tue, 25 Nov 2025 10:36:57 +0100 Subject: [PATCH 32/75] Added preselect annotation option to html/epub reader (#1208) --- Zotero/Controllers/CustomURLController.swift | 4 ++-- Zotero/Controllers/OpenItemsController.swift | 10 +++++----- Zotero/Scenes/AppCoordinator.swift | 4 ++-- Zotero/Scenes/Detail/DetailCoordinator.swift | 16 ++++++++++++---- .../Detail/HTML:EPUB/HtmlEpubCoordinator.swift | 5 ++++- .../HTML:EPUB/Models/HtmlEpubReaderState.swift | 15 ++++++++++++++- .../ViewModels/HtmlEpubReaderActionHandler.swift | 8 +++++++- .../Views/HtmlEpubDocumentViewController.swift | 4 +++- reader | 2 +- 9 files changed, 50 insertions(+), 18 deletions(-) diff --git a/Zotero/Controllers/CustomURLController.swift b/Zotero/Controllers/CustomURLController.swift index 0c4300e68..da9931261 100644 --- a/Zotero/Controllers/CustomURLController.swift +++ b/Zotero/Controllers/CustomURLController.swift @@ -94,12 +94,12 @@ final class CustomURLController { case "text/html": if FeatureGates.enabled.contains(.htmlEpubReader) { - presentation = .html(library: library, key: key, parentKey: parentKey, url: url) + presentation = .html(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: annotation) } case "application/epub+zip": if FeatureGates.enabled.contains(.htmlEpubReader) { - presentation = .epub(library: library, key: key, parentKey: parentKey, url: url) + presentation = .epub(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: annotation) } default: diff --git a/Zotero/Controllers/OpenItemsController.swift b/Zotero/Controllers/OpenItemsController.swift index be6f01799..58a617f8f 100644 --- a/Zotero/Controllers/OpenItemsController.swift +++ b/Zotero/Controllers/OpenItemsController.swift @@ -116,8 +116,8 @@ final class OpenItemsController { enum Presentation { case pdf(library: Library, key: String, parentKey: String?, url: URL, page: Int?, preselectedAnnotationKey: String?, previewRects: [CGRect]?) - case html(library: Library, key: String, parentKey: String?, url: URL) - case epub(library: Library, key: String, parentKey: String?, url: URL) + case html(library: Library, key: String, parentKey: String?, url: URL, preselectedAnnotationKey: String?) + case epub(library: Library, key: String, parentKey: String?, url: URL, preselectedAnnotationKey: String?) case note(library: Library, key: String, text: String, tags: [Tag], parentTitleData: NoteEditorState.TitleData?, title: String) // MARK: Properties @@ -133,21 +133,21 @@ final class OpenItemsController { var library: Library { switch self { - case .pdf(let library, _, _, _, _, _, _), .html(let library, _, _, _), .epub(let library, _, _, _), .note(let library, _, _, _, _, _): + case .pdf(let library, _, _, _, _, _, _), .html(let library, _, _, _, _), .epub(let library, _, _, _, _), .note(let library, _, _, _, _, _): return library } } var key: String { switch self { - case .pdf(_, let key, _, _, _, _, _), .html(_, let key, _, _), .epub(_, let key, _, _), .note(_, let key, _, _, _, _): + case .pdf(_, let key, _, _, _, _, _), .html(_, let key, _, _, _), .epub(_, let key, _, _, _), .note(_, let key, _, _, _, _): return key } } var parentKey: String? { switch self { - case .pdf(_, _, let parentKey, _, _, _, _), .html(_, _, let parentKey, _), .epub(_, _, let parentKey, _): + case .pdf(_, _, let parentKey, _, _, _, _), .html(_, _, let parentKey, _, _), .epub(_, _, let parentKey, _, _): return parentKey case .note: diff --git a/Zotero/Scenes/AppCoordinator.swift b/Zotero/Scenes/AppCoordinator.swift index 604682d9e..c76713f15 100644 --- a/Zotero/Scenes/AppCoordinator.swift +++ b/Zotero/Scenes/AppCoordinator.swift @@ -272,10 +272,10 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { return .pdf(library: library, key: key, parentKey: parentKey, url: url, page: nil, preselectedAnnotationKey: nil, previewRects: nil) case .html(_, let key): - return .html(library: library, key: key, parentKey: parentKey, url: url) + return .html(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: nil) case .epub(_, let key): - return .epub(library: library, key: key, parentKey: parentKey, url: url) + return .epub(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: nil) case .note: return nil diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 81b870882..5aebcef44 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -360,10 +360,18 @@ final class DetailCoordinator: Coordinator { return navigationController } - func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL) -> NavigationViewController { + func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, preselectedAnnotationKey: String? = nil) -> NavigationViewController { let navigationController = NavigationViewController() navigationController.modalPresentationStyle = .fullScreen - let coordinator = HtmlEpubCoordinator(key: key, parentKey: parentKey, libraryId: libraryId, url: url, navigationController: navigationController, controllers: controllers) + let coordinator = HtmlEpubCoordinator( + key: key, + parentKey: parentKey, + libraryId: libraryId, + url: url, + preselectedAnnotationKey: preselectedAnnotationKey, + navigationController: navigationController, + controllers: controllers + ) coordinator.parentCoordinator = self self.childCoordinators.append(coordinator) coordinator.start(animated: false) @@ -595,8 +603,8 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { previewRects: previewRects ) - case .html(let library, let key, let parentKey, let url), .epub(let library, let key, let parentKey, let url): - return createHtmlEpubController(key: key, parentKey: parentKey, libraryId: library.identifier, url: url) + case .html(let library, let key, let parentKey, let url, let preselectedAnnotationKey), .epub(let library, let key, let parentKey, let url, let preselectedAnnotationKey): + return createHtmlEpubController(key: key, parentKey: parentKey, libraryId: library.identifier, url: url, preselectedAnnotationKey: preselectedAnnotationKey) case .note(let library, let key, let text, let tags, let parentTitleData, let title): let kind: NoteEditorKind = library.metadataEditable ? .edit(key: key) : .readOnly(key: key) diff --git a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift index 982d562e7..f4649505f 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift @@ -33,14 +33,16 @@ final class HtmlEpubCoordinator: ReaderCoordinator { private let parentKey: String? private let libraryId: LibraryIdentifier private let url: URL + private let preselectedAnnotationKey: String? internal unowned let controllers: Controllers private let disposeBag: DisposeBag - init(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, navigationController: NavigationViewController, controllers: Controllers) { + init(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, preselectedAnnotationKey: String?, navigationController: NavigationViewController, controllers: Controllers) { self.key = key self.parentKey = parentKey self.libraryId = libraryId self.url = url + self.preselectedAnnotationKey = preselectedAnnotationKey self.navigationController = navigationController self.controllers = controllers childCoordinators = [] @@ -78,6 +80,7 @@ final class HtmlEpubCoordinator: ReaderCoordinator { key: key, parentKey: parentKey, title: try? dbStorage.perform(request: ReadFilenameDbRequest(libraryId: libraryId, key: key), on: .main), + preselectedAnnotationKey: preselectedAnnotationKey, settings: Defaults.shared.htmlEpubSettings, libraryId: libraryId, userId: userId, diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift index 561869e58..a6004bddb 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift @@ -44,6 +44,7 @@ struct HtmlEpubReaderState: ViewModelState { let url: URL let annotationsJson: String let page: Page? + let selectedAnnotationKey: String? } struct DocumentUpdate { @@ -142,7 +143,18 @@ struct HtmlEpubReaderState: ViewModelState { var outlineSearch: String var interfaceStyle: UIUserInterfaceStyle - init(url: URL, key: String, parentKey: String?, title: String?, settings: HtmlEpubSettings, libraryId: LibraryIdentifier, userId: Int, username: String, interfaceStyle: UIUserInterfaceStyle) { + init( + url: URL, + key: String, + parentKey: String?, + title: String?, + preselectedAnnotationKey: String?, + settings: HtmlEpubSettings, + libraryId: LibraryIdentifier, + userId: Int, + username: String, + interfaceStyle: UIUserInterfaceStyle + ) { let originalFile = Files.file(from: url) let temporaryDirectory = Files.tmpReaderDirectory self.originalFile = originalFile @@ -155,6 +167,7 @@ struct HtmlEpubReaderState: ViewModelState { self.userId = userId self.username = username self.interfaceStyle = interfaceStyle + selectedAnnotationKey = preselectedAnnotationKey sortedKeys = [] annotations = [:] comments = [:] diff --git a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift index d14b872eb..d45a801e3 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift @@ -757,7 +757,13 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro let (sortedKeys, annotations, json) = processAnnotations(items: annotationItems) let (type, page) = try loadTypeAndPage(from: viewModel.state.documentFile, rawPage: rawPage) - let documentData = HtmlEpubReaderState.DocumentData(type: type, url: viewModel.state.documentFile.createUrl(), annotationsJson: json, page: page) + let documentData = HtmlEpubReaderState.DocumentData( + type: type, + url: viewModel.state.documentFile.createUrl(), + annotationsJson: json, + page: page, + selectedAnnotationKey: viewModel.state.selectedAnnotationKey + ) let (library, libraryToken) = try viewModel.state.library.identifier.observe(in: dbStorage, changes: { [weak self, weak viewModel] library in guard let self, let viewModel else { return } diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubDocumentViewController.swift b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubDocumentViewController.swift index 945479c07..0c0ab2a6d 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubDocumentViewController.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubDocumentViewController.swift @@ -179,7 +179,9 @@ class HtmlEpubDocumentViewController: UIViewController { DDLogInfo("HtmlEpubDocumentViewController: try creating view for \(data.type); page = \(String(describing: data.page))") DDLogInfo("URL: \(data.url.absoluteString)") var javascript = "createView({ type: '\(data.type)', url: '\(data.url.absoluteString.replacingOccurrences(of: "'", with: #"\'"#))', annotations: \(data.annotationsJson)" - if let page = data.page { + if let key = data.selectedAnnotationKey { + javascript += ", location: {annotationID: '\(key)'}" + } else if let page = data.page { switch page { case .html(let scrollYPercent): javascript += ", viewState: {scrollYPercent: \(scrollYPercent), scale: 1}" diff --git a/reader b/reader index 42cf554cb..1ed21a0c1 160000 --- a/reader +++ b/reader @@ -1 +1 @@ -Subproject commit 42cf554cb7c102034ec9ff4ce2a18a41533e224c +Subproject commit 1ed21a0c102a686402f18e044a887a6d3e173dec From a1e419a512cd85d195db4a6eb5855cab9397b649 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Thu, 4 Dec 2025 14:41:09 +0100 Subject: [PATCH 33/75] Hide full sync option behind multi-tap gesture (#1214) --- .../Debugging/Models/DebuggingAction.swift | 1 + .../Debugging/Models/DebuggingState.swift | 2 ++ .../ViewModels/DebuggingActionHandler.swift | 5 +++++ .../Settings/Debugging/Views/DebuggingView.swift | 15 ++++++++++----- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingAction.swift b/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingAction.swift index 3163af5ef..60cec8e3c 100644 --- a/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingAction.swift +++ b/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingAction.swift @@ -18,4 +18,5 @@ enum DebuggingAction { case clearLogs case showLogs case showFullSyncDebugging + case setAdvancedVisible(Bool) } diff --git a/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingState.swift b/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingState.swift index c13dd90f1..c25dc3129 100644 --- a/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingState.swift +++ b/Zotero/Scenes/Master/Settings/Debugging/Models/DebuggingState.swift @@ -13,9 +13,11 @@ import RxSwift struct DebuggingState: ViewModelState { var isLogging: Bool var numberOfLines: Int + var advancedVisible: Bool var disposeBag: DisposeBag? init(isLogging: Bool, numberOfLines: Int) { + advancedVisible = false self.isLogging = isLogging self.numberOfLines = numberOfLines } diff --git a/Zotero/Scenes/Master/Settings/Debugging/ViewModels/DebuggingActionHandler.swift b/Zotero/Scenes/Master/Settings/Debugging/ViewModels/DebuggingActionHandler.swift index 2c2856640..09d2ece2b 100644 --- a/Zotero/Scenes/Master/Settings/Debugging/ViewModels/DebuggingActionHandler.swift +++ b/Zotero/Scenes/Master/Settings/Debugging/ViewModels/DebuggingActionHandler.swift @@ -73,6 +73,11 @@ struct DebuggingActionHandler: ViewModelActionHandler { case .showFullSyncDebugging: coordinatorDelegate.showFullSyncDebugging() + + case .setAdvancedVisible(let visible): + update(viewModel: viewModel) { state in + state.advancedVisible = visible + } } } diff --git a/Zotero/Scenes/Master/Settings/Debugging/Views/DebuggingView.swift b/Zotero/Scenes/Master/Settings/Debugging/Views/DebuggingView.swift index 1b8033afd..f575d7011 100644 --- a/Zotero/Scenes/Master/Settings/Debugging/Views/DebuggingView.swift +++ b/Zotero/Scenes/Master/Settings/Debugging/Views/DebuggingView.swift @@ -70,14 +70,19 @@ struct DebuggingView: View { } } - Section { - Button { - viewModel.process(action: .showFullSyncDebugging) - } label: { - SettingsListButtonRow(text: L10n.Settings.fullSyncDebug, detailText: nil, enabled: true) + if viewModel.state.advancedVisible { + Section { + Button { + viewModel.process(action: .showFullSyncDebugging) + } label: { + SettingsListButtonRow(text: L10n.Settings.fullSyncDebug, detailText: nil, enabled: true) + } } } } + .onTapGesture(count: 6, perform: { + self.viewModel.process(action: .setAdvancedVisible(true)) + }) .navigationBarTitle(L10n.Settings.debug) } } From d5f0f0ff03a2a0babb19dec2a686f4cebf8c049b Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sun, 7 Dec 2025 11:27:42 +0200 Subject: [PATCH 34/75] Improve PDF loading logging --- .../Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index e4da2551d..fdd2d4683 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -1797,6 +1797,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi let (item, liveAnnotations, storedPage) = try loadItemAnnotationsAndPage(for: key, libraryId: viewModel.state.library.identifier) if checkWhetherMd5Changed(forItem: item, andUpdateViewModel: viewModel, handler: self) { + DDLogWarn("PDFReaderActionHandler: MD5 has changed, before PDF was loaded") return } @@ -1875,6 +1876,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi observeDocument(in: viewModel) } catch let error { // TODO: - Show error + DDLogError("PDFReaderActionHandler: failed to load PDF: \(error)") } func observe(library: Library, viewModel: ViewModel, handler: PDFReaderActionHandler) { From ceea182a9e64ddb204724ca673039d3bc64f3692 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 8 Dec 2025 15:09:13 +0200 Subject: [PATCH 35/75] Add debug reader item action for debug builds (#1213) * Add debug reader item action for debug builds * Allow http or https reader build URL for debug reader item action --- .../PDFWorkerWebViewHandler.swift | 2 +- Zotero/Models/Defaults.swift | 8 ++ Zotero/Models/Files.swift | 2 +- Zotero/Scenes/Detail/DetailCoordinator.swift | 21 ++-- .../HTML:EPUB/HtmlEpubCoordinator.swift | 14 ++- .../Models/HtmlEpubReaderState.swift | 14 ++- .../HtmlEpubReaderActionHandler.swift | 10 +- .../Views/ItemDetailViewController.swift | 2 +- .../Detail/Items/Models/ItemAction.swift | 28 ++++- .../ViewModels/ItemsToolbarController.swift | 4 +- .../Items/Views/BaseItemsViewController.swift | 110 +++++++++++++++++- .../Items/Views/ItemsTableViewHandler.swift | 10 +- .../Items/Views/ItemsViewController.swift | 14 ++- .../Views/RItemsTableViewDataSource.swift | 6 + .../Views/TrashTableViewDataSource.swift | 11 +- .../Trash/Views/TrashViewController.swift | 14 ++- 16 files changed, 231 insertions(+), 39 deletions(-) diff --git a/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift b/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift index 060fe7d9a..044f1b10f 100644 --- a/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift +++ b/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift @@ -69,7 +69,7 @@ final class PDFWorkerWebViewHandler: WebViewHandler { guard let workerJsUrl = Bundle.main.url(forResource: "worker", withExtension: "js", subdirectory: "Bundled/pdf_worker") else { return .error(Error.cantFindFile("worker.js")) } - let temporaryDirectory = Files.tmpReaderDirectory + let temporaryDirectory = Files.temporaryDirectory self.temporaryDirectory = temporaryDirectory do { try fileStorage.copy(from: workerHtmlUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "html")) diff --git a/Zotero/Models/Defaults.swift b/Zotero/Models/Defaults.swift index af2fc4c56..399a41d11 100644 --- a/Zotero/Models/Defaults.swift +++ b/Zotero/Models/Defaults.swift @@ -185,6 +185,14 @@ final class Defaults { @UserDefault(key: "ClearPSPDFKitCacheGuard", defaultValue: currentClearPSPDFKitCacheGuard - 1) var clearPSPDFKitCacheGuard: Int + // MARK: - Debug + + @UserDefault(key: "DebugReaderUUIDByHash", defaultValue: [:]) + var debugReaderUUIDByHash: [String: String] + + @OptionalUserDefault(key: "LastDebugReaderHashOrURL") + var lastDebugReaderHashOrURL: String? + // MARK: - Actions func reset() { diff --git a/Zotero/Models/Files.swift b/Zotero/Models/Files.swift index dfebd96a8..6d8365cd7 100644 --- a/Zotero/Models/Files.swift +++ b/Zotero/Models/Files.swift @@ -206,7 +206,7 @@ struct Files { // MARK: Epub/Html reader - static var tmpReaderDirectory: File { + static var temporaryDirectory: File { return FileData.directory(rootPath: Files.cachesRootPath, relativeComponents: ["Zotero", UUID().uuidString]) } diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 5aebcef44..944d8507b 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -48,7 +48,7 @@ protocol DetailItemsCoordinatorDelegate: AnyObject { func showCitation(using presenter: UIViewController?, for itemIds: Set, libraryId: LibraryIdentifier, delegate: DetailCitationCoordinatorDelegate?) func copyBibliography(using presenter: UIViewController, for itemIds: Set, libraryId: LibraryIdentifier, delegate: DetailCopyBibliographyCoordinatorDelegate?) func showCiteExport(for itemIds: Set, libraryId: LibraryIdentifier) - func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier) + func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) func show(error: ItemsError) func showLookup() } @@ -65,7 +65,7 @@ protocol DetailItemDetailCoordinatorDelegate: AnyObject { func showDeletedAlertForItem(completion: @escaping (Bool) -> Void) func show(error: ItemDetailError, viewModel: ViewModel) func showDataReloaded(completion: @escaping () -> Void) - func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier) + func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) } protocol DetailNoteEditorCoordinatorDelegate: AnyObject { @@ -203,15 +203,15 @@ final class DetailCoordinator: Coordinator { } } - func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier) { + func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) { guard let (attachment, sourceItem) = navigationController?.viewControllers.reversed() .compactMap({ ($0 as? DetailCoordinatorAttachmentProvider)?.attachment(for: key, parentKey: parentKey, libraryId: libraryId) }) .first else { return } - show(attachment: attachment, parentKey: parentKey, libraryId: libraryId, sourceItem: sourceItem) + show(attachment: attachment, parentKey: parentKey, libraryId: libraryId, sourceItem: sourceItem, readerURL: readerURL) } - private func show(attachment: Attachment, parentKey: String?, libraryId: LibraryIdentifier, sourceItem: UIPopoverPresentationControllerSourceItem) { + private func show(attachment: Attachment, parentKey: String?, libraryId: LibraryIdentifier, sourceItem: UIPopoverPresentationControllerSourceItem, readerURL: URL?) { switch attachment.type { case .url(let url): show(url: url) @@ -228,7 +228,7 @@ final class DetailCoordinator: Coordinator { case "text/html", "application/epub+zip": if FeatureGates.enabled.contains(.htmlEpubReader) { DDLogInfo("DetailCoordinator: show HTML / EPUB \(attachment.key)") - showHtmlEpubReader(for: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId) + showHtmlEpubReader(for: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId, readerURL: readerURL) } else if contentType == "text/html" { showWebView(for: url) } else { @@ -360,7 +360,7 @@ final class DetailCoordinator: Coordinator { return navigationController } - func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, preselectedAnnotationKey: String? = nil) -> NavigationViewController { + func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, readerURL: URL?, preselectedAnnotationKey: String? = nil) -> NavigationViewController { let navigationController = NavigationViewController() navigationController.modalPresentationStyle = .fullScreen let coordinator = HtmlEpubCoordinator( @@ -368,6 +368,7 @@ final class DetailCoordinator: Coordinator { parentKey: parentKey, libraryId: libraryId, url: url, + readerURL: readerURL, preselectedAnnotationKey: preselectedAnnotationKey, navigationController: navigationController, controllers: controllers @@ -383,8 +384,8 @@ final class DetailCoordinator: Coordinator { navigationController?.present(controller, animated: true, completion: nil) } - private func showHtmlEpubReader(for url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier) { - let controller = createHtmlEpubController(key: key, parentKey: parentKey, libraryId: libraryId, url: url) + private func showHtmlEpubReader(for url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) { + let controller = createHtmlEpubController(key: key, parentKey: parentKey, libraryId: libraryId, url: url, readerURL: readerURL) self.navigationController?.present(controller, animated: true, completion: nil) } @@ -604,7 +605,7 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { ) case .html(let library, let key, let parentKey, let url, let preselectedAnnotationKey), .epub(let library, let key, let parentKey, let url, let preselectedAnnotationKey): - return createHtmlEpubController(key: key, parentKey: parentKey, libraryId: library.identifier, url: url, preselectedAnnotationKey: preselectedAnnotationKey) + return createHtmlEpubController(key: key, parentKey: parentKey, libraryId: library.identifier, url: url, readerURL: nil, preselectedAnnotationKey: preselectedAnnotationKey) case .note(let library, let key, let text, let tags, let parentTitleData, let title): let kind: NoteEditorKind = library.metadataEditable ? .edit(key: key) : .readOnly(key: key) diff --git a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift index f4649505f..243e39103 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift @@ -33,15 +33,26 @@ final class HtmlEpubCoordinator: ReaderCoordinator { private let parentKey: String? private let libraryId: LibraryIdentifier private let url: URL + private let readerURL: URL? private let preselectedAnnotationKey: String? internal unowned let controllers: Controllers private let disposeBag: DisposeBag - init(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, preselectedAnnotationKey: String?, navigationController: NavigationViewController, controllers: Controllers) { + init( + key: String, + parentKey: String?, + libraryId: LibraryIdentifier, + url: URL, + readerURL: URL?, + preselectedAnnotationKey: String?, + navigationController: NavigationViewController, + controllers: Controllers + ) { self.key = key self.parentKey = parentKey self.libraryId = libraryId self.url = url + self.readerURL = readerURL self.preselectedAnnotationKey = preselectedAnnotationKey self.navigationController = navigationController self.controllers = controllers @@ -76,6 +87,7 @@ final class HtmlEpubCoordinator: ReaderCoordinator { idleTimerController: controllers.idleTimerController ) let state = HtmlEpubReaderState( + readerURL: readerURL, url: url, key: key, parentKey: parentKey, diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift index a6004bddb..4d8fe4804 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift @@ -93,8 +93,9 @@ struct HtmlEpubReaderState: ViewModelState { } } + let readerURL: URL? let originalFile: File - let readerFile: File + let readerDirectory: File let documentFile: File let key: String let parentKey: String? @@ -143,7 +144,12 @@ struct HtmlEpubReaderState: ViewModelState { var outlineSearch: String var interfaceStyle: UIUserInterfaceStyle + var readerFile: File { + readerDirectory.copy(withName: "view", ext: "html") + } + init( + readerURL: URL?, url: URL, key: String, parentKey: String?, @@ -155,11 +161,11 @@ struct HtmlEpubReaderState: ViewModelState { username: String, interfaceStyle: UIUserInterfaceStyle ) { + self.readerURL = readerURL ?? Bundle.main.url(forResource: "reader", withExtension: nil, subdirectory: "Bundled") let originalFile = Files.file(from: url) - let temporaryDirectory = Files.tmpReaderDirectory self.originalFile = originalFile - readerFile = temporaryDirectory.copy(withName: "view", ext: "html") - documentFile = temporaryDirectory.appending(relativeComponent: "content").copy(withName: originalFile.name, ext: originalFile.ext) + readerDirectory = Files.temporaryDirectory + documentFile = readerDirectory.appending(relativeComponent: "content").copy(withName: originalFile.name, ext: originalFile.ext) self.key = key self.parentKey = parentKey self.title = title diff --git a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift index d45a801e3..6e749cb3c 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift @@ -716,8 +716,8 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro } private func initialise(in viewModel: ViewModel) { - guard let readerUrl = Bundle.main.url(forResource: "view", withExtension: "html", subdirectory: "Bundled/reader") else { - DDLogError("HtmlEpubReaderActionHandler: can't find reader view.html") + guard let readerURL = viewModel.state.readerURL else { + DDLogError("HtmlEpubReaderActionHandler: reader URL missing") return } @@ -725,9 +725,9 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro do { // Copy reader files to temporary directory - let readerFiles: [File] = try fileStorage.contentsOfDirectory(at: Files.file(from: readerUrl).directory) + let readerFiles: [File] = try fileStorage.contentsOfDirectory(at: Files.file(from: readerURL)) for file in readerFiles { - try fileStorage.copy(from: file, to: viewModel.state.readerFile.copy(withName: file.name, ext: file.ext)) + try fileStorage.copy(from: file, to: viewModel.state.readerDirectory.copy(withName: file.name, ext: file.ext)) } // Copy document files (in case of snapshot there can be multiple files) to temporary sub-directory let documentFiles: [File] = try fileStorage.contentsOfDirectory(at: viewModel.state.originalFile.directory) @@ -744,7 +744,7 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro } private func deinitialise(in viewModel: ViewModel) { - try? fileStorage.remove(viewModel.state.readerFile.directory) + try? fileStorage.remove(viewModel.state.readerDirectory) } private func load(in viewModel: ViewModel) { diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift index 16e29fd07..ff1bf366c 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift @@ -114,7 +114,7 @@ final class ItemDetailViewController: UIViewController { switch update.kind { case .ready: viewModel.process(action: .attachmentOpened(update.key)) - coordinatorDelegate?.showAttachment(key: update.key, parentKey: update.parentKey, libraryId: update.libraryId) + coordinatorDelegate?.showAttachment(key: update.key, parentKey: update.parentKey, libraryId: update.libraryId, readerURL: nil) case .failed(let error): viewModel.process(action: .attachmentOpened(update.key)) diff --git a/Zotero/Scenes/Detail/Items/Models/ItemAction.swift b/Zotero/Scenes/Detail/Items/Models/ItemAction.swift index 80f4022ac..6a600a818 100644 --- a/Zotero/Scenes/Detail/Items/Models/ItemAction.swift +++ b/Zotero/Scenes/Detail/Items/Models/ItemAction.swift @@ -10,7 +10,22 @@ import UIKit struct ItemAction { enum Kind { - case addToCollection, delete, duplicate, removeFromCollection, restore, trash, sort, filter, createParent, retrieveMetadata, copyCitation, copyBibliography, share, download, removeDownload + case addToCollection + case delete + case duplicate + case removeFromCollection + case restore + case trash + case sort + case filter + case createParent + case retrieveMetadata + case copyCitation + case copyBibliography + case share + case download + case removeDownload + case debugReader } private enum Image { @@ -32,8 +47,11 @@ struct ItemAction { } var isDestructive: Bool { switch self.type { - case .delete, .trash: return true - case .addToCollection, .duplicate, .removeFromCollection, .restore, .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .share, .download, .removeDownload: return false + case .delete, .trash: + return true + + case .addToCollection, .duplicate, .removeFromCollection, .restore, .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .share, .download, .removeDownload, .debugReader: + return false } } @@ -100,6 +118,10 @@ struct ItemAction { case .removeDownload: self.title = L10n.Items.Action.removeDownload self._image = .system("arrow.down.circle.dotted") + + case .debugReader: + self.title = "Debug Reader" + self._image = .system("ladybug") } } } diff --git a/Zotero/Scenes/Detail/Items/ViewModels/ItemsToolbarController.swift b/Zotero/Scenes/Detail/Items/ViewModels/ItemsToolbarController.swift index 5aaad66fc..15fdcb761 100644 --- a/Zotero/Scenes/Detail/Items/ViewModels/ItemsToolbarController.swift +++ b/Zotero/Scenes/Detail/Items/ViewModels/ItemsToolbarController.swift @@ -105,7 +105,7 @@ final class ItemsToolbarController { case .addToCollection, .trash, .delete, .removeFromCollection, .restore, .share, .download, .removeDownload: item.tag = ToolbarItem.empty.tag - case .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .duplicate: + case .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .duplicate, .debugReader: break } switch action.type { @@ -133,7 +133,7 @@ final class ItemsToolbarController { case .removeDownload: item.accessibilityLabel = L10n.Accessibility.Items.removeDownloads - case .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .duplicate: + case .sort, .filter, .createParent, .retrieveMetadata, .copyCitation, .copyBibliography, .duplicate, .debugReader: break } item.rx.tap.subscribe(onNext: { [weak self] _ in diff --git a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift index e1abfac5b..ff5545aef 100644 --- a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift @@ -12,6 +12,7 @@ import CocoaLumberjackSwift import RealmSwift import RxSwift import WebKit +import ZIPFoundation class BaseItemsViewController: UIViewController { enum RightBarButtonItem: Int { @@ -33,11 +34,16 @@ class BaseItemsViewController: UIViewController { var handler: ItemsTableViewHandler? weak var tagFilterDelegate: ItemsTagFilterDelegate? weak var coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)? + private let debugReaderQueue: DispatchQueue? + private var readerURL: URL? init(controllers: Controllers, coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)) { self.controllers = controllers self.coordinatorDelegate = coordinatorDelegate - self.disposeBag = DisposeBag() + disposeBag = DisposeBag() + #if DEBUG + debugReaderQueue = DispatchQueue(label: "org.zotero.DebugReaderQueue", qos: .userInteractive) + #endif super.init(nibName: nil, bundle: nil) } @@ -154,7 +160,8 @@ class BaseItemsViewController: UIViewController { switch update.kind { case .ready: - coordinatorDelegate?.showAttachment(key: update.key, parentKey: update.parentKey, libraryId: update.libraryId) + coordinatorDelegate?.showAttachment(key: update.key, parentKey: update.parentKey, libraryId: update.libraryId, readerURL: readerURL) + readerURL = nil case .failed(let error): coordinatorDelegate?.showAttachmentError(error) @@ -164,6 +171,105 @@ class BaseItemsViewController: UIViewController { } } + private enum DebugReaderError: LocalizedError { + case invalidInput + + var errorDescription: String? { + switch self { + case .invalidInput: + return "Please enter a valid reader commit hash or build zip URL." + } + } + } + + func processDebugReaderAction(tapAction: ItemsTableViewHandler.TapAction, completion: @escaping (() -> Void)) { + guard case .attachment = tapAction else { return } + let alertController = UIAlertController(title: "Debug Reader", message: "Enter or ", preferredStyle: .alert) + alertController.addTextField { textField in + textField.placeholder = " or " + textField.autocapitalizationType = .none + textField.autocorrectionType = .no + textField.keyboardType = .default + textField.text = Defaults.shared.lastDebugReaderHashOrURL + } + alertController.addAction(UIAlertAction(title: L10n.cancel, style: .cancel)) + alertController.addAction(UIAlertAction(title: L10n.ok, style: .default) { [weak self, weak alertController] _ in + guard let self, let hashOrURL = alertController?.textFields?.first?.text?.trimmingCharacters(in: .whitespacesAndNewlines), !hashOrURL.isEmpty else { + showError(DebugReaderError.invalidInput) + return + } + let url: URL? + var hash: String? + if hashOrURL.starts(with: "http://") || hashOrURL.starts(with: "https://") { + url = URL(string: hashOrURL) + } else if let uuidString = Defaults.shared.debugReaderUUIDByHash[hashOrURL] { + Defaults.shared.lastDebugReaderHashOrURL = hashOrURL + readerURL = FileData.directory(rootPath: Files.cachesRootPath, relativeComponents: ["Zotero", uuidString, "ios"]).createUrl() + completion() + return + } else { + url = URL(string: "https://zotero-download.s3.amazonaws.com/ci/reader/\(hashOrURL).zip") + hash = hashOrURL + } + guard let url, let debugReaderQueue else { + cache(uuidString: nil, for: hash, hashOrURL: nil) + showError(DebugReaderError.invalidInput) + return + } + let temporaryDirectory = Files.temporaryDirectory + let fileExtension = url.pathExtension + let fileName = url.deletingPathExtension().lastPathComponent + let zipFile = FileData(rootPath: temporaryDirectory.rootPath, relativeComponents: temporaryDirectory.relativeComponents, name: fileName, ext: fileExtension) + let request = FileRequest(url: url, destination: zipFile) + controllers.apiClient + .download(request: request, queue: debugReaderQueue) + .subscribe(onNext: { request in + request.resume() + }, onError: { [weak self] error in + cache(uuidString: nil, for: hash, hashOrURL: nil) + guard let self else { return } + readerURL = nil + showError(error) + }, onCompleted: { [weak self] in + guard let self else { return } + do { + let destinationURL = zipFile.createRelativeUrl() + try FileManager.default.unzipItem(at: zipFile.createUrl(), to: destinationURL) + try? controllers.fileStorage.remove(zipFile) + cache(uuidString: destinationURL.lastPathComponent, for: hash, hashOrURL: hashOrURL) + readerURL = destinationURL.appending(path: "ios") + DispatchQueue.main.async { + completion() + } + } catch { + cache(uuidString: nil, for: hash, hashOrURL: nil) + readerURL = nil + showError(error) + } + }) + .disposed(by: disposeBag) + }) + present(alertController, animated: true) + + func cache(uuidString: String?, for hash: String?, hashOrURL: String?) { + if let hash { + var debugReaderUUIDByHash = Defaults.shared.debugReaderUUIDByHash + debugReaderUUIDByHash[hash] = uuidString + Defaults.shared.debugReaderUUIDByHash = debugReaderUUIDByHash + } + Defaults.shared.lastDebugReaderHashOrURL = hashOrURL + } + + func showError(_ error: Error) { + DispatchQueue.main.async { [weak self] in + guard let self else { return } + let alert = UIAlertController(title: L10n.error, message: error.localizedDescription, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: L10n.ok, style: .cancel)) + present(alert, animated: true) + } + } + } + // MARK: - To override var library: Library { diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsTableViewHandler.swift b/Zotero/Scenes/Detail/Items/Views/ItemsTableViewHandler.swift index 8de310217..b08537513 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsTableViewHandler.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsTableViewHandler.swift @@ -17,7 +17,7 @@ protocol ItemsTableViewHandlerDelegate: AnyObject { var collectionKey: String? { get } var library: Library { get } - func process(action: ItemAction.Kind, at index: Int, completionAction: ((Bool) -> Void)?) + func process(action: ItemAction.Kind, at indexPath: IndexPath, completionAction: ((Bool) -> Void)?) func process(tapAction action: ItemsTableViewHandler.TapAction) func process(dragAndDropAction action: ItemsTableViewHandler.DragAndDropAction) } @@ -104,7 +104,7 @@ final class ItemsTableViewHandler: NSObject { private func createContextMenu(at indexPath: IndexPath) -> UIMenu { let actions: [UIAction] = dataSource.createContextMenuActions(at: indexPath.row).map({ action in return UIAction(title: action.title, image: action.image, attributes: (action.isDestructive ? .destructive : [])) { [weak self] _ in - self?.delegate.process(action: action.type, at: indexPath.row, completionAction: nil) + self?.delegate.process(action: action.type, at: indexPath, completionAction: nil) } }) return UIMenu(title: "", children: actions) @@ -118,7 +118,7 @@ final class ItemsTableViewHandler: NSObject { completion(false) return } - delegate.process(action: action.type, at: indexPath.row, completionAction: completion) + delegate.process(action: action.type, at: indexPath, completionAction: completion) }) contextualAction.image = action.image switch action.type { @@ -133,7 +133,9 @@ final class ItemsTableViewHandler: NSObject { case .removeFromCollection: contextualAction.backgroundColor = .systemPurple - case .sort, .filter, .copyCitation, .copyBibliography, .share, .download, .removeDownload: break + + case .sort, .filter, .copyCitation, .copyBibliography, .share, .download, .removeDownload, .debugReader: + break } return contextualAction }) diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift index 51373811f..7e2d4ca9a 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift @@ -340,6 +340,9 @@ final class ItemsViewController: BaseItemsViewController { case .removeDownload: viewModel.process(action: .removeDownloads(selectedKeys)) + + case .debugReader: + break } } @@ -479,8 +482,15 @@ extension ItemsViewController: ItemsTableViewHandlerDelegate { } } - func process(action: ItemAction.Kind, at index: Int, completionAction: ((Bool) -> Void)?) { - guard let object = dataSource.object(at: index) else { return } + func process(action: ItemAction.Kind, at indexPath: IndexPath, completionAction: ((Bool) -> Void)?) { + if action == .debugReader { + guard let tapAction = dataSource.tapAction(for: indexPath) else { return } + processDebugReaderAction(tapAction: tapAction) { [weak self] in + self?.process(tapAction: tapAction) + } + return + } + guard let object = dataSource.object(at: indexPath.row) else { return } process(action: action, for: [object.key], button: nil, completionAction: completionAction) } diff --git a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift index 715150210..0f750b3b3 100644 --- a/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift +++ b/Zotero/Scenes/Detail/Items/Views/RItemsTableViewDataSource.swift @@ -190,6 +190,12 @@ extension RItemsTableViewDataSource: ItemsTableViewDataSource { } actions.append(ItemAction(type: .trash)) + #if DEBUG + if let attachment, case .file(_, let contentType, _, _, _) = attachment.type, contentType == "application/epub+zip" || contentType == "text/html" { + actions.append(ItemAction(type: .debugReader)) + } + #endif + return actions } } diff --git a/Zotero/Scenes/Detail/Trash/Views/TrashTableViewDataSource.swift b/Zotero/Scenes/Detail/Trash/Views/TrashTableViewDataSource.swift index 6313c580d..3b2463632 100644 --- a/Zotero/Scenes/Detail/Trash/Views/TrashTableViewDataSource.swift +++ b/Zotero/Scenes/Detail/Trash/Views/TrashTableViewDataSource.swift @@ -97,9 +97,12 @@ extension TrashTableViewDataSource { func createContextMenuActions(at index: Int) -> [ItemAction] { var actions = [ItemAction(type: .restore), ItemAction(type: .delete)] + guard let key = snapshot?.key(for: index), let attachment = viewModel.state.itemDataCache[key]?.accessory?.attachment else { + return actions + } // Add download/remove downloaded option for attachments - if let key = snapshot?.key(for: index), let accessory = viewModel.state.itemDataCache[key]?.accessory, let location = accessory.attachment?.location { + if let location = attachment.location { switch location { case .local: actions.append(ItemAction(type: .removeDownload)) @@ -116,6 +119,12 @@ extension TrashTableViewDataSource { } } + #if DEBUG + if case .file(_, let contentType, _, _, _) = attachment.type, contentType == "application/epub+zip" || contentType == "text/html" { + actions.append(ItemAction(type: .debugReader)) + } + #endif + return actions } } diff --git a/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift b/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift index 33d0c29d7..57478c83a 100644 --- a/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift +++ b/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift @@ -191,6 +191,9 @@ final class TrashViewController: BaseItemsViewController { case .removeDownload: viewModel.process(action: .removeDownloads(selectedKeys)) + + case .debugReader: + break } } @@ -272,8 +275,15 @@ extension TrashViewController: ItemsTableViewHandlerDelegate { return nil } - func process(action: ItemAction.Kind, at index: Int, completionAction: ((Bool) -> Void)?) { - guard let key = dataSource.key(at: index) else { return } + func process(action: ItemAction.Kind, at indexPath: IndexPath, completionAction: ((Bool) -> Void)?) { + if action == .debugReader { + guard let tapAction = dataSource.tapAction(for: indexPath) else { return } + processDebugReaderAction(tapAction: tapAction) { [weak self] in + self?.process(tapAction: tapAction) + } + return + } + guard let key = dataSource.key(at: indexPath.row) else { return } process(action: action, for: [key], button: nil, completionAction: completionAction) } From b0960c4f09e63bb7119239e226b9511b8c91e088 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 8 Dec 2025 15:16:17 +0200 Subject: [PATCH 36/75] Update reader settings preferred content size when needed (#1215) * Update reader settings preferred content size when needed * Use fixed width for reader settings --- .../HTML:EPUB/Models/HtmlEpubSettings.swift | 2 +- .../Detail/PDF/Models/PDFSettings.swift | 2 +- Zotero/Scenes/Detail/ReaderCoordinator.swift | 3 +-- .../General/Models/ReaderSettingsState.swift | 2 +- .../Views/ReaderSettingsViewController.swift | 21 ++++++++++++++++++- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubSettings.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubSettings.swift index f77430ee9..458dcd000 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubSettings.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubSettings.swift @@ -19,7 +19,7 @@ struct HtmlEpubSettings { } extension HtmlEpubSettings: ReaderSettings { - var preferredContentSize: CGSize { + var minimumPreferredContentSize: CGSize { return CGSize(width: 480, height: 92) } diff --git a/Zotero/Scenes/Detail/PDF/Models/PDFSettings.swift b/Zotero/Scenes/Detail/PDF/Models/PDFSettings.swift index 7f29b74ab..9a0111348 100644 --- a/Zotero/Scenes/Detail/PDF/Models/PDFSettings.swift +++ b/Zotero/Scenes/Detail/PDF/Models/PDFSettings.swift @@ -35,7 +35,7 @@ extension PDFSettings: ReaderSettings { return appearanceMode } - var preferredContentSize: CGSize { + var minimumPreferredContentSize: CGSize { return CGSize(width: 480, height: 308) } diff --git a/Zotero/Scenes/Detail/ReaderCoordinator.swift b/Zotero/Scenes/Detail/ReaderCoordinator.swift index a2428809a..0b8bdd680 100644 --- a/Zotero/Scenes/Detail/ReaderCoordinator.swift +++ b/Zotero/Scenes/Detail/ReaderCoordinator.swift @@ -287,7 +287,7 @@ extension ReaderCoordinator { let state = ReaderSettingsState(settings: settings) let viewModel = ViewModel(initialState: state, handler: ReaderSettingsActionHandler()) - let baseController = ReaderSettingsViewController(rows: settings.rows, viewModel: viewModel) + let baseController = ReaderSettingsViewController(rows: settings.rows, minimumPreferredContentSize: settings.minimumPreferredContentSize, viewModel: viewModel) let controller: UIViewController if UIDevice.current.userInterfaceIdiom == .pad { controller = baseController @@ -296,7 +296,6 @@ extension ReaderCoordinator { } controller.modalPresentationStyle = .popover controller.popoverPresentationController?.sourceItem = sender - controller.preferredContentSize = settings.preferredContentSize controller.overrideUserInterfaceStyle = settings.appearance.userInterfaceStyle navigationController?.present(controller, animated: true, completion: nil) diff --git a/Zotero/Scenes/General/Models/ReaderSettingsState.swift b/Zotero/Scenes/General/Models/ReaderSettingsState.swift index e669ed1a7..c6862eb32 100644 --- a/Zotero/Scenes/General/Models/ReaderSettingsState.swift +++ b/Zotero/Scenes/General/Models/ReaderSettingsState.swift @@ -17,7 +17,7 @@ protocol ReaderSettings { var pageFitting: PSPDFKitUI.PDFConfiguration.SpreadFitting { get } var appearance: ReaderSettingsState.Appearance { get } var isFirstPageAlwaysSingle: Bool { get } - var preferredContentSize: CGSize { get } + var minimumPreferredContentSize: CGSize { get } var rows: [ReaderSettingsViewController.Row] { get } } diff --git a/Zotero/Scenes/General/Views/ReaderSettingsViewController.swift b/Zotero/Scenes/General/Views/ReaderSettingsViewController.swift index 9cb56e911..b0e5d02f8 100644 --- a/Zotero/Scenes/General/Views/ReaderSettingsViewController.swift +++ b/Zotero/Scenes/General/Views/ReaderSettingsViewController.swift @@ -23,12 +23,14 @@ final class ReaderSettingsViewController: UICollectionViewController { let viewModel: ViewModel private let rows: [Row] + private let minimumPreferredContentSize: CGSize private let disposeBag: DisposeBag private var dataSource: UICollectionViewDiffableDataSource! - init(rows: [Row], viewModel: ViewModel) { + init(rows: [Row], minimumPreferredContentSize: CGSize, viewModel: ViewModel) { self.rows = rows + self.minimumPreferredContentSize = minimumPreferredContentSize self.viewModel = viewModel disposeBag = DisposeBag() @@ -42,6 +44,9 @@ final class ReaderSettingsViewController: UICollectionViewController { override func viewDidLoad() { super.viewDidLoad() + preferredContentSize = minimumPreferredContentSize + navigationController?.preferredContentSize = minimumPreferredContentSize + setupNavigationBarIfNeeded() collectionView.allowsSelection = false collectionView.collectionViewLayout = createCollectionViewLayout() @@ -56,6 +61,20 @@ final class ReaderSettingsViewController: UICollectionViewController { .disposed(by: disposeBag) } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + updatePreferredContentSizeIfNeeded() + + func updatePreferredContentSizeIfNeeded() { + let contentHeight = max(collectionView.collectionViewLayout.collectionViewContentSize.height, minimumPreferredContentSize.height) + let contentWidth = minimumPreferredContentSize.width + let newPreferredContentSize = CGSize(width: contentWidth, height: contentHeight) + guard preferredContentSize != newPreferredContentSize else { return } + preferredContentSize = newPreferredContentSize + navigationController?.preferredContentSize = newPreferredContentSize + } + } + // MARK: - Actions private func update(state: ReaderSettingsState) { From 92c3ac73804b5b147800ca9f8d8e308fd53af0d3 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Fri, 12 Dec 2025 11:30:27 +0100 Subject: [PATCH 37/75] Removed arxiv.org ATS exception (#1216) --- Zotero/Info.plist | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Zotero/Info.plist b/Zotero/Info.plist index 96fd987d6..22bf2eaf1 100644 --- a/Zotero/Info.plist +++ b/Zotero/Info.plist @@ -54,13 +54,6 @@ NSExceptionAllowsInsecureHTTPLoads - arxiv.org - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - NSCameraUsageDescription From 50950c6957d40732e42a3008de8437b6013c7b0c Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Tue, 16 Dec 2025 12:02:06 +0100 Subject: [PATCH 38/75] Added the ability to edit order or hide annotation tools (#1217) --- Zotero.xcodeproj/project.pbxproj | 48 ++++++++++ Zotero/Assets/en.lproj/Localizable.strings | 4 + Zotero/Models/AnnotationTool.swift | 88 ++++++++++++++++++- Zotero/Models/Defaults.swift | 26 ++++++ .../Views/HtmlEpubReaderViewController.swift | 2 +- .../AnnotationToolbarViewController.swift | 69 +-------------- .../PDF/Views/PDFReaderViewController.swift | 2 +- .../AnnotationToolsSettingsAction.swift | 16 ++++ .../Models/AnnotationToolsSettingsState.swift | 27 ++++++ ...AnnotationToolsSettingsActionHandler.swift | 69 +++++++++++++++ .../Views/AnnotationToolsSettingsView.swift | 74 ++++++++++++++++ .../List/Views/SettingsListView.swift | 8 +- .../Master/Settings/SettingsCoordinator.swift | 8 ++ 13 files changed, 368 insertions(+), 73 deletions(-) create mode 100644 Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsAction.swift create mode 100644 Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsState.swift create mode 100644 Zotero/Scenes/Master/Settings/Annotation Tools/ViewModels/AnnotationToolsSettingsActionHandler.swift create mode 100644 Zotero/Scenes/Master/Settings/Annotation Tools/Views/AnnotationToolsSettingsView.swift diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index f4c2c3784..74bd2dc1b 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -939,6 +939,10 @@ B3A47C3A29015FE800E7D90D /* TableOfContentsState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A47C3929015FE800E7D90D /* TableOfContentsState.swift */; }; B3A53FF72B14CDB2004BB9D7 /* ReadEmojiTagsDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A53FF62B14CDB2004BB9D7 /* ReadEmojiTagsDbRequest.swift */; }; B3A6C59F252CA08300F24CBE /* PSPDFKit in Frameworks */ = {isa = PBXBuildFile; productRef = B3A6C59E252CA08300F24CBE /* PSPDFKit */; }; + B3A71F4B2EEC39A80006A737 /* AnnotationToolsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A71F4A2EEC39A20006A737 /* AnnotationToolsSettingsView.swift */; }; + B3A71F4D2EEC39BA0006A737 /* AnnotationToolsSettingsActionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A71F4C2EEC39B50006A737 /* AnnotationToolsSettingsActionHandler.swift */; }; + B3A71F4F2EEC39CD0006A737 /* AnnotationToolsSettingsState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A71F4E2EEC39CA0006A737 /* AnnotationToolsSettingsState.swift */; }; + B3A71F512EEC39D90006A737 /* AnnotationToolsSettingsAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A71F502EEC39D60006A737 /* AnnotationToolsSettingsAction.swift */; }; B3A94B4A2462F5D300BC7910 /* PSPDFKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A94B492462F5D300BC7910 /* PSPDFKit+Extensions.swift */; }; B3A95DAA29194BDE00BCCF11 /* DashedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A95DA929194BDE00BCCF11 /* DashedView.swift */; }; B3AAABD72502A40900031065 /* searchresponse_unknownfields.json in Resources */ = {isa = PBXBuildFile; fileRef = B3AAABD52502A40600031065 /* searchresponse_unknownfields.json */; }; @@ -1994,6 +1998,10 @@ B3A47C3729015FDD00E7D90D /* TableOfContentsAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableOfContentsAction.swift; sourceTree = ""; }; B3A47C3929015FE800E7D90D /* TableOfContentsState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableOfContentsState.swift; sourceTree = ""; }; B3A53FF62B14CDB2004BB9D7 /* ReadEmojiTagsDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadEmojiTagsDbRequest.swift; sourceTree = ""; }; + B3A71F4A2EEC39A20006A737 /* AnnotationToolsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationToolsSettingsView.swift; sourceTree = ""; }; + B3A71F4C2EEC39B50006A737 /* AnnotationToolsSettingsActionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationToolsSettingsActionHandler.swift; sourceTree = ""; }; + B3A71F4E2EEC39CA0006A737 /* AnnotationToolsSettingsState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationToolsSettingsState.swift; sourceTree = ""; }; + B3A71F502EEC39D60006A737 /* AnnotationToolsSettingsAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationToolsSettingsAction.swift; sourceTree = ""; }; B3A94B492462F5D300BC7910 /* PSPDFKit+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PSPDFKit+Extensions.swift"; sourceTree = ""; }; B3A95DA929194BDE00BCCF11 /* DashedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashedView.swift; sourceTree = ""; }; B3AAABD52502A40600031065 /* searchresponse_unknownfields.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = searchresponse_unknownfields.json; sourceTree = ""; }; @@ -3651,6 +3659,7 @@ B374911F2488D7040042FF85 /* Settings */ = { isa = PBXGroup; children = ( + B3A71F462EEC397C0006A737 /* Annotation Tools */, B3E8FE092714297200F51458 /* Cite */, B3E8FE4327142B0A00F51458 /* Debugging */, B3E8FE1F271429C300F51458 /* Export */, @@ -3715,6 +3724,41 @@ path = Controllers; sourceTree = ""; }; + B3A71F462EEC397C0006A737 /* Annotation Tools */ = { + isa = PBXGroup; + children = ( + B3A71F472EEC39950006A737 /* Models */, + B3A71F482EEC39950006A737 /* ViewModels */, + B3A71F492EEC39950006A737 /* Views */, + ); + path = "Annotation Tools"; + sourceTree = ""; + }; + B3A71F472EEC39950006A737 /* Models */ = { + isa = PBXGroup; + children = ( + B3A71F502EEC39D60006A737 /* AnnotationToolsSettingsAction.swift */, + B3A71F4E2EEC39CA0006A737 /* AnnotationToolsSettingsState.swift */, + ); + path = Models; + sourceTree = ""; + }; + B3A71F482EEC39950006A737 /* ViewModels */ = { + isa = PBXGroup; + children = ( + B3A71F4C2EEC39B50006A737 /* AnnotationToolsSettingsActionHandler.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + B3A71F492EEC39950006A737 /* Views */ = { + isa = PBXGroup; + children = ( + B3A71F4A2EEC39A20006A737 /* AnnotationToolsSettingsView.swift */, + ); + path = Views; + sourceTree = ""; + }; B3AB389F238EC02D008A1ABB /* View Controllers */ = { isa = PBXGroup; children = ( @@ -5087,6 +5131,7 @@ B3C9D60C24DA9DEA003EA1EE /* CollectionsSearchActionHandler.swift in Sources */, B324277825C82E6500567504 /* UnsubscribeWsMessage.swift in Sources */, B3593F3D241A61C700760E20 /* ItemsState.swift in Sources */, + B3A71F4B2EEC39A80006A737 /* AnnotationToolsSettingsView.swift in Sources */, B30566AE23FC051F003304F2 /* SettingsResponse.swift in Sources */, B3422F46289BADD800C53DD2 /* ItemDetailFieldEditContentView.swift in Sources */, B3FE4B99268DDE4900CE123F /* CitationBibliographyExportState.swift in Sources */, @@ -5169,6 +5214,7 @@ B305661323FC051E003304F2 /* ArrayEncoding.swift in Sources */, B305667723FC051F003304F2 /* UIFont+Extensions.swift in Sources */, B3DF9AD52747AB4F007933CB /* ApiEndpoint.swift in Sources */, + B3A71F4F2EEC39CD0006A737 /* AnnotationToolsSettingsState.swift in Sources */, B322B4772673A41200BC3D08 /* ReadStyleDbRequest.swift in Sources */, B3E8FE8827143BDD00F51458 /* SyncSettingsAction.swift in Sources */, B3F9A4B82B04C97A00684030 /* HtmlEpubSettings.swift in Sources */, @@ -5515,6 +5561,7 @@ B3863FC82AD819AB005082F0 /* EndItemCreationDbRequest.swift in Sources */, B3DDDAAC24CAD6810014DF99 /* InsetLabel.swift in Sources */, B3329A552B738C4E00F17636 /* CitationAuthorCell.swift in Sources */, + B3A71F4D2EEC39BA0006A737 /* AnnotationToolsSettingsActionHandler.swift in Sources */, B3E8FE8927143BDD00F51458 /* SyncSettingsView.swift in Sources */, B3593F7A241A76E600760E20 /* CollectionEditState.swift in Sources */, B3C6AB28248E1B720009AC96 /* SyncBatchProcessor.swift in Sources */, @@ -5542,6 +5589,7 @@ B31FACD225DBC7E900DD5F14 /* ActiveObjectDeletedConflictReceiverHandler.swift in Sources */, B3EA5A192B724E9400E283D7 /* CitationLocatorCell.swift in Sources */, B36181FF24C9A7C000B30D56 /* LoginState.swift in Sources */, + B3A71F512EEC39D90006A737 /* AnnotationToolsSettingsAction.swift in Sources */, B3E8FE3627142A0900F51458 /* RemoteStyle.swift in Sources */, B3F55A1729EED04700A6716E /* ReadFilteredTagsDbRequest.swift in Sources */, B34A9F5E25BF12F7007C9A4A /* ReadFilenameDbRequest.swift in Sources */, diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 7589f9861..369bac4a3 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -365,6 +365,10 @@ "settings.full_sync.start" = "Start Full Sync Debugging"; "settings.full_sync.other_in_progress" = "Sync is already in progress. Wait for it to finish."; "settings.full_sync.in_progress" = "A full sync is in progress. Wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; "shareext.save" = "Save to Zotero"; "shareext.decoding_attachment" = "Searching for items"; diff --git a/Zotero/Models/AnnotationTool.swift b/Zotero/Models/AnnotationTool.swift index beff18605..63b6296e4 100644 --- a/Zotero/Models/AnnotationTool.swift +++ b/Zotero/Models/AnnotationTool.swift @@ -6,9 +6,9 @@ // Copyright © 2023 Corporation for Digital Scholarship. All rights reserved. // -import Foundation +import UIKit -enum AnnotationTool { +enum AnnotationTool: Hashable, Codable { case ink case image case note @@ -16,4 +16,88 @@ enum AnnotationTool { case eraser case underline case freeText + + var image: UIImage { + switch self { + case .highlight: + return Asset.Images.Annotations.highlightLarge.image + + case .note: + return Asset.Images.Annotations.noteLarge.image + + case .image: + return Asset.Images.Annotations.areaLarge.image + + case .ink: + return Asset.Images.Annotations.inkLarge.image + + case .eraser: + return Asset.Images.Annotations.eraserLarge.image + + case .underline: + return Asset.Images.Annotations.underlineLarge.image + + case .freeText: + return Asset.Images.Annotations.textLarge.image + } + } + + var name: String { + switch self { + case .eraser: + return L10n.Pdf.AnnotationToolbar.eraser + + case .freeText: + return L10n.Pdf.AnnotationToolbar.text + + case .highlight: + return L10n.Pdf.AnnotationToolbar.highlight + + case .image: + return L10n.Pdf.AnnotationToolbar.image + + case .ink: + return L10n.Pdf.AnnotationToolbar.ink + + case .note: + return L10n.Pdf.AnnotationToolbar.note + + case .underline: + return L10n.Pdf.AnnotationToolbar.underline + } + } + + var accessibilityLabel: String { + switch self { + case .eraser: + return L10n.Accessibility.Pdf.eraserAnnotationTool + + case .freeText: + return L10n.Accessibility.Pdf.textAnnotationTool + + case .highlight: + return L10n.Accessibility.Pdf.highlightAnnotationTool + + case .image: + return L10n.Accessibility.Pdf.imageAnnotationTool + + case .ink: + return L10n.Accessibility.Pdf.inkAnnotationTool + + case .note: + return L10n.Accessibility.Pdf.noteAnnotationTool + + case .underline: + return L10n.Accessibility.Pdf.underlineAnnotationTool + } + } +} + +struct AnnotationToolButton: Codable, Identifiable { + let type: AnnotationTool + let isVisible: Bool + + var id: AnnotationTool { + return type + } } diff --git a/Zotero/Models/Defaults.swift b/Zotero/Models/Defaults.swift index 399a41d11..c749bec1e 100644 --- a/Zotero/Models/Defaults.swift +++ b/Zotero/Models/Defaults.swift @@ -126,10 +126,36 @@ final class Defaults { @CodableUserDefault(key: "PDFReaderSettings", defaultValue: PDFSettings.default, encoder: Defaults.jsonEncoder, decoder: Defaults.jsonDecoder, defaults: .standard) var pdfSettings: PDFSettings + @CodableUserDefault( + key: "PDFReaderAnnotationTools", + defaultValue: [ + AnnotationToolButton(type: .highlight, isVisible: true), + AnnotationToolButton(type: .underline, isVisible: true), + AnnotationToolButton(type: .note, isVisible: true), + AnnotationToolButton(type: .freeText, isVisible: true), + AnnotationToolButton(type: .image, isVisible: true), + AnnotationToolButton(type: .ink, isVisible: true), + AnnotationToolButton(type: .eraser, isVisible: true) + ], + encoder: Defaults.jsonEncoder, + decoder: Defaults.jsonDecoder, + defaults: .standard + ) + var pdfAnnotationTools: [AnnotationToolButton] + // MARK: - HTML / Epub Settings @CodableUserDefault(key: "HtmlEpubReaderSettings", defaultValue: HtmlEpubSettings.default, encoder: Defaults.jsonEncoder, decoder: Defaults.jsonDecoder, defaults: .standard) var htmlEpubSettings: HtmlEpubSettings + + @CodableUserDefault( + key: "HtmlEpubReaderAnnotationTools", + defaultValue: [AnnotationToolButton(type: .highlight, isVisible: true), AnnotationToolButton(type: .underline, isVisible: true), AnnotationToolButton(type: .note, isVisible: true)], + encoder: Defaults.jsonEncoder, + decoder: Defaults.jsonDecoder, + defaults: .standard + ) + var htmlEpubAnnotationTools: [AnnotationToolButton] #endif // MARK: - Citation / Bibliography Export diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift index 921ffc9e4..64511d9fe 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift @@ -155,7 +155,7 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare documentController.parentDelegate = self documentController.view.translatesAutoresizingMaskIntoConstraints = false - let annotationToolbar = AnnotationToolbarViewController(tools: [.highlight, .underline, .note], undoRedoEnabled: false, size: navigationBarHeight) + let annotationToolbar = AnnotationToolbarViewController(tools: Defaults.shared.htmlEpubAnnotationTools.map({ $0.type }), undoRedoEnabled: false, size: navigationBarHeight) annotationToolbar.delegate = self let sidebarController = HtmlEpubSidebarViewController(viewModel: viewModel) diff --git a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift index 5a8e4f730..234876828 100644 --- a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift @@ -91,77 +91,10 @@ class AnnotationToolbarViewController: UIViewController { init(tools: [AnnotationTool], undoRedoEnabled: Bool, size: CGFloat) { self.size = size - toolButtons = tools.map({ button(from: $0) }) + toolButtons = tools.map({ ToolButton(type: $0, title: $0.name, accessibilityLabel: $0.accessibilityLabel, image: $0.image, isHidden: false) }) self.undoRedoEnabled = undoRedoEnabled disposeBag = DisposeBag() super.init(nibName: nil, bundle: nil) - - func button(from tool: AnnotationTool) -> ToolButton { - switch tool { - case .highlight: - ToolButton( - type: .highlight, - title: L10n.Pdf.AnnotationToolbar.highlight, - accessibilityLabel: L10n.Accessibility.Pdf.highlightAnnotationTool, - image: Asset.Images.Annotations.highlightLarge.image, - isHidden: false - ) - - case .note: - ToolButton( - type: .note, - title: L10n.Pdf.AnnotationToolbar.note, - accessibilityLabel: L10n.Accessibility.Pdf.noteAnnotationTool, - image: Asset.Images.Annotations.noteLarge.image, - isHidden: false - ) - - case .image: - ToolButton( - type: .image, - title: L10n.Pdf.AnnotationToolbar.image, - accessibilityLabel: L10n.Accessibility.Pdf.imageAnnotationTool, - image: Asset.Images.Annotations.areaLarge.image, - isHidden: false - ) - - case .ink: - ToolButton( - type: .ink, - title: L10n.Pdf.AnnotationToolbar.ink, - accessibilityLabel: L10n.Accessibility.Pdf.inkAnnotationTool, - image: Asset.Images.Annotations.inkLarge.image, - isHidden: false - ) - - case .eraser: - ToolButton( - type: .eraser, - title: L10n.Pdf.AnnotationToolbar.eraser, - accessibilityLabel: L10n.Accessibility.Pdf.eraserAnnotationTool, - image: Asset.Images.Annotations.eraserLarge.image, - isHidden: false - ) - - case .underline: - ToolButton( - type: .underline, - title: L10n.Pdf.AnnotationToolbar.underline, - accessibilityLabel: L10n.Accessibility.Pdf.underlineAnnotationTool, - image: Asset.Images.Annotations.underlineLarge.image, - isHidden: false - ) - - case .freeText: - ToolButton( - type: .freeText, - title: L10n.Pdf.AnnotationToolbar.text, - accessibilityLabel: L10n.Accessibility.Pdf.textAnnotationTool, - image: Asset.Images.Annotations.textLarge.image, - isHidden: false - ) - } - } } required init?(coder: NSCoder) { diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index 697bb8d76..1ff4ef577 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -232,7 +232,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { separator.translatesAutoresizingMaskIntoConstraints = false separator.backgroundColor = Asset.Colors.annotationSidebarBorderColor.color - let annotationToolbar = AnnotationToolbarViewController(tools: [.highlight, .underline, .note, .freeText, .image, .ink, .eraser], undoRedoEnabled: true, size: navigationBarHeight) + let annotationToolbar = AnnotationToolbarViewController(tools: Defaults.shared.pdfAnnotationTools.map({ $0.type }), undoRedoEnabled: true, size: navigationBarHeight) annotationToolbar.delegate = self let intraDocumentNavigationHandler = IntraDocumentNavigationButtonsHandler( diff --git a/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsAction.swift b/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsAction.swift new file mode 100644 index 000000000..909a51ac0 --- /dev/null +++ b/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsAction.swift @@ -0,0 +1,16 @@ +// +// AnnotationToolsSettingsAction.swift +// Zotero +// +// Created by Michal Rentka on 12.12.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import Foundation + +enum AnnotationToolsSettingsAction { + case move(IndexSet, Int, AnnotationToolsSettingsState.Section) + case reset(AnnotationToolsSettingsState.Section) + case setVisible(Bool, AnnotationTool, AnnotationToolsSettingsState.Section) + case save +} diff --git a/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsState.swift b/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsState.swift new file mode 100644 index 000000000..530c79b5e --- /dev/null +++ b/Zotero/Scenes/Master/Settings/Annotation Tools/Models/AnnotationToolsSettingsState.swift @@ -0,0 +1,27 @@ +// +// AnnotationToolsSettingsState.swift +// Zotero +// +// Created by Michal Rentka on 12.12.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import UIKit + +struct AnnotationToolsSettingsState: ViewModelState { + enum Section: Int { + case pdf + case htmlEpub + } + + var pdfTools: [AnnotationToolButton] + var htmlEpubTools: [AnnotationToolButton] + + init(pdfAnnotationTools: [AnnotationToolButton], htmlEpubAnnotationTools: [AnnotationToolButton]) { + pdfTools = pdfAnnotationTools + htmlEpubTools = htmlEpubAnnotationTools + } + + mutating func cleanup() { + } +} diff --git a/Zotero/Scenes/Master/Settings/Annotation Tools/ViewModels/AnnotationToolsSettingsActionHandler.swift b/Zotero/Scenes/Master/Settings/Annotation Tools/ViewModels/AnnotationToolsSettingsActionHandler.swift new file mode 100644 index 000000000..58d6c4132 --- /dev/null +++ b/Zotero/Scenes/Master/Settings/Annotation Tools/ViewModels/AnnotationToolsSettingsActionHandler.swift @@ -0,0 +1,69 @@ +// +// AnnotationToolsSettingsViewModel.swift +// Zotero +// +// Created by Michal Rentka on 12.12.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import Foundation + +struct AnnotationToolsSettingsViewModel: ViewModelActionHandler { + typealias Action = AnnotationToolsSettingsAction + typealias State = AnnotationToolsSettingsState + + func process(action: AnnotationToolsSettingsAction, in viewModel: ViewModel) { + switch action { + case .move(let fromIndices, let toIndex, let section): + update(viewModel: viewModel) { state in + switch section { + case .pdf: + state.pdfTools.move(fromOffsets: fromIndices, toOffset: toIndex) + + case .htmlEpub: + state.htmlEpubTools.move(fromOffsets: fromIndices, toOffset: toIndex) + } + } + + case .reset(let section): + update(viewModel: viewModel) { state in + switch section { + case .pdf: + state.pdfTools = [ + AnnotationToolButton(type: .highlight, isVisible: true), + AnnotationToolButton(type: .underline, isVisible: true), + AnnotationToolButton(type: .note, isVisible: true), + AnnotationToolButton(type: .freeText, isVisible: true), + AnnotationToolButton(type: .image, isVisible: true), + AnnotationToolButton(type: .ink, isVisible: true), + AnnotationToolButton(type: .eraser, isVisible: true) + ] + + case .htmlEpub: + state.htmlEpubTools = [ + AnnotationToolButton(type: .highlight, isVisible: true), + AnnotationToolButton(type: .underline, isVisible: true), + AnnotationToolButton(type: .note, isVisible: true) + ] + } + } + + case .setVisible(let isVisible, let tool, let section): + update(viewModel: viewModel) { state in + switch section { + case .pdf: + guard let index = state.pdfTools.firstIndex(where: { $0.type == tool }) else { return } + state.pdfTools[index] = AnnotationToolButton(type: tool, isVisible: isVisible) + + case .htmlEpub: + guard let index = state.htmlEpubTools.firstIndex(where: { $0.type == tool }) else { return } + state.htmlEpubTools[index] = AnnotationToolButton(type: tool, isVisible: isVisible) + } + } + + case .save: + Defaults.shared.pdfAnnotationTools = viewModel.state.pdfTools + Defaults.shared.htmlEpubAnnotationTools = viewModel.state.htmlEpubTools + } + } +} diff --git a/Zotero/Scenes/Master/Settings/Annotation Tools/Views/AnnotationToolsSettingsView.swift b/Zotero/Scenes/Master/Settings/Annotation Tools/Views/AnnotationToolsSettingsView.swift new file mode 100644 index 000000000..e6715bc72 --- /dev/null +++ b/Zotero/Scenes/Master/Settings/Annotation Tools/Views/AnnotationToolsSettingsView.swift @@ -0,0 +1,74 @@ +// +// AnnotationToolsSettingsView.swift +// Zotero +// +// Created by Michal Rentka on 12.12.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import SwiftUI + +struct AnnotationToolsSettingsView: View { + @EnvironmentObject var viewModel: ViewModel + @State var section: AnnotationToolsSettingsState.Section = .pdf + + var body: some View { + Form { + Section { + ForEach(tools) { tool in + HStack { + Image(uiImage: tool.type.image) + Text(tool.type.name) + Spacer() + Toggle(isOn: .init(get: { tool.isVisible }, set: { viewModel.process(action: .setVisible($0, tool.type, section)) }), label: {}) + Spacer() + .frame(width: 18) + Image(systemName: "line.3.horizontal") + .foregroundStyle(.secondary) + .opacity(0.5) + } + .opacity(tool.isVisible ? 1 : 0.5) + .accessibilityLabel(tool.type.accessibilityLabel) + } + .onMove(perform: { fromIndices, toIndex in viewModel.process(action: .move(fromIndices, toIndex, section)) }) + } header: { + VStack { + Picker("", selection: $section) { + Text(L10n.Settings.AnnotationTools.pdf).tag(AnnotationToolsSettingsState.Section.pdf) + Text(L10n.Settings.AnnotationTools.htmlEpub).tag(AnnotationToolsSettingsState.Section.htmlEpub) + } + .pickerStyle(.segmented) + Spacer() + .frame(height: 14) + } + } + } + .listStyle(GroupedListStyle()) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button(L10n.Settings.AnnotationTools.reset) { + viewModel.process(action: .reset(section)) + } + } + } + .onDisappear { + viewModel.process(action: .save) + } + } + + var tools: [AnnotationToolButton] { + switch section { + case .pdf: + return viewModel.state.pdfTools + + case .htmlEpub: + return viewModel.state.htmlEpubTools + } + } +} + +extension AnnotationTool: Identifiable { + var id: AnnotationTool { + return self + } +} diff --git a/Zotero/Scenes/Master/Settings/List/Views/SettingsListView.swift b/Zotero/Scenes/Master/Settings/List/Views/SettingsListView.swift index ce41a7433..f7ee239db 100644 --- a/Zotero/Scenes/Master/Settings/List/Views/SettingsListView.swift +++ b/Zotero/Scenes/Master/Settings/List/Views/SettingsListView.swift @@ -41,12 +41,18 @@ struct SettingsListView: View { }, label: { SettingsListButtonRow(text: L10n.Settings.Cite.title, detailText: nil, enabled: true) }) - + Button(action: { self.coordinatorDelegate?.showSavingSettings() }, label: { SettingsListButtonRow(text: L10n.Settings.Saving.title, detailText: nil, enabled: true) }) + + Button(action: { + self.coordinatorDelegate?.showAnnotationToolsSettings() + }, label: { + SettingsListButtonRow(text: L10n.Settings.annotationTools, detailText: nil, enabled: true) + }) Button(action: { self.coordinatorDelegate?.showStorageSettings() diff --git a/Zotero/Scenes/Master/Settings/SettingsCoordinator.swift b/Zotero/Scenes/Master/Settings/SettingsCoordinator.swift index f72933066..f0ef79d16 100644 --- a/Zotero/Scenes/Master/Settings/SettingsCoordinator.swift +++ b/Zotero/Scenes/Master/Settings/SettingsCoordinator.swift @@ -30,6 +30,7 @@ protocol SettingsCoordinatorDelegate: AnyObject { func showSchemePicker(viewModel: ViewModel) func promptZoteroDirCreation(url: String, create: @escaping () -> Void, cancel: @escaping () -> Void) func showWeb(url: URL, completion: @escaping () -> Void) + func showAnnotationToolsSettings() } protocol CitationStyleSearchSettingsCoordinatorDelegate: AnyObject { @@ -321,6 +322,13 @@ extension SettingsCoordinator: SettingsCoordinatorDelegate { let view = GeneralSettingsView().environmentObject(viewModel) self.pushDefaultSize(view: view) } + + func showAnnotationToolsSettings() { + let state = AnnotationToolsSettingsState(pdfAnnotationTools: Defaults.shared.pdfAnnotationTools, htmlEpubAnnotationTools: Defaults.shared.htmlEpubAnnotationTools) + let viewModel = ViewModel(initialState: state, handler: AnnotationToolsSettingsViewModel()) + let view = AnnotationToolsSettingsView().environmentObject(viewModel) + pushDefaultSize(view: view) + } func dismiss() { self.navigationController?.dismiss(animated: true, completion: nil) From d86304635619de7c31eafe32c0bc832c4765fc91 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Wed, 17 Dec 2025 09:31:32 +0100 Subject: [PATCH 39/75] Speech for PDF documents (#1131) --- ZShare/Info.plist | 4 +- Zotero.xcodeproj/project.pbxproj | 44 +- Zotero/Assets/en.lproj/Localizable.strings | 11 +- .../ReadSpeechLanguageDbRequest.swift | 22 + .../Requests/SetSpeechLanguageDbRequest.swift | 24 ++ Zotero/Controllers/PDFWorkerController.swift | 108 ++++- Zotero/Controllers/SpeechManager.swift | 394 +++++++++++++++++ .../PDFWorkerWebViewHandler.swift | 89 ++-- .../Controllers/Web View Handling/worker.html | 4 +- Zotero/Info.plist | 2 + Zotero/Models/Database/Database.swift | 2 +- Zotero/Models/Database/RItem.swift | 2 + Zotero/Models/Defaults.swift | 8 + Zotero/Models/FeatureGates.swift | 9 +- .../Views/HtmlEpubReaderViewController.swift | 3 + Zotero/Scenes/Detail/PDF/PDFCoordinator.swift | 104 ++++- .../PDF/Views/AnnotationToolbarHandler.swift | 15 +- .../AnnotationToolbarViewController.swift | 190 +++++--- .../PDF/Views/PDFDocumentViewController.swift | 3 + .../PDF/Views/PDFReaderViewController.swift | 151 ++++++- .../AccessibilityPopupViewController.swift | 405 ++++++++++++++++++ ...AccessibilitySpeechControlsStackView.swift | 121 ++++++ .../AccessibilitySpeechControlsView.swift | 88 ++++ .../Views/AccessibilityViewHandler.swift | 200 +++++++++ .../Views/SpeechLanguagePickerView.swift | 56 +++ .../General/Views/SpeechVoicePickerView.swift | 195 +++++++++ 26 files changed, 2086 insertions(+), 168 deletions(-) create mode 100644 Zotero/Controllers/Database/Requests/ReadSpeechLanguageDbRequest.swift create mode 100644 Zotero/Controllers/Database/Requests/SetSpeechLanguageDbRequest.swift create mode 100644 Zotero/Controllers/SpeechManager.swift create mode 100644 Zotero/Scenes/General/Views/AccessibilityPopupViewController.swift create mode 100644 Zotero/Scenes/General/Views/AccessibilitySpeechControlsStackView.swift create mode 100644 Zotero/Scenes/General/Views/AccessibilitySpeechControlsView.swift create mode 100644 Zotero/Scenes/General/Views/AccessibilityViewHandler.swift create mode 100644 Zotero/Scenes/General/Views/SpeechLanguagePickerView.swift create mode 100644 Zotero/Scenes/General/Views/SpeechVoicePickerView.swift diff --git a/ZShare/Info.plist b/ZShare/Info.plist index 52e6d1593..f740d43d8 100644 --- a/ZShare/Info.plist +++ b/ZShare/Info.plist @@ -54,7 +54,7 @@ NSMicrophoneUsageDescription Access to microphone - UIDesignRequiresCompatibility - + UIDesignRequiresCompatibility + diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 74bd2dc1b..6813d8c3b 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -799,9 +799,15 @@ B372CEE7248673DF00B423AE /* GroupRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B372CEE22486512500B423AE /* GroupRequest.swift */; }; B372CEE92486748500B423AE /* MarkGroupForResyncSyncAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B372CEE82486748500B423AE /* MarkGroupForResyncSyncAction.swift */; }; B372CEEA248675A200B423AE /* MarkGroupForResyncSyncAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B372CEE82486748500B423AE /* MarkGroupForResyncSyncAction.swift */; }; + B37352AF2E140DF10078BB00 /* AccessibilityViewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37352AE2E140DE70078BB00 /* AccessibilityViewHandler.swift */; }; + B37352B12E141F9F0078BB00 /* AccessibilitySpeechControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37352B02E141F990078BB00 /* AccessibilitySpeechControlsView.swift */; }; B373877328FEA0C7004E5031 /* PDFSidebarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B373877228FEA0C7004E5031 /* PDFSidebarViewController.swift */; }; B373B1B82BBD74F400DCF893 /* DeleteFailedItemsDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B373B1B62BBD748600DCF893 /* DeleteFailedItemsDbRequest.swift */; }; B373C98F2B1F5431007FD56C /* PDFThumbnailsLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B373C98E2B1F5431007FD56C /* PDFThumbnailsLayout.swift */; }; + B37434C72E38C5A800D8FAC2 /* SetSpeechLanguageDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37434C62E38C59A00D8FAC2 /* SetSpeechLanguageDbRequest.swift */; }; + B37434C82E38C5A800D8FAC2 /* SetSpeechLanguageDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37434C62E38C59A00D8FAC2 /* SetSpeechLanguageDbRequest.swift */; }; + B37434CA2E38C5B100D8FAC2 /* ReadSpeechLanguageDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37434C92E38C5AB00D8FAC2 /* ReadSpeechLanguageDbRequest.swift */; }; + B37434CB2E38C5B100D8FAC2 /* ReadSpeechLanguageDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37434C92E38C5AB00D8FAC2 /* ReadSpeechLanguageDbRequest.swift */; }; B3748D2026566F4800ED05F8 /* ContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3748D1F26566F4800ED05F8 /* ContainerViewController.swift */; }; B3748D2226566F6900ED05F8 /* ContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3748D2126566F6900ED05F8 /* ContainerViewController.swift */; }; B3756E8F2B835BDC0001CD0A /* IntraDocumentNavigationButtonsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3756E8E2B835BDC0001CD0A /* IntraDocumentNavigationButtonsHandler.swift */; }; @@ -854,6 +860,7 @@ B3830CEA255451DC00910FE0 /* TagPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3830CE8255451DC00910FE0 /* TagPickerViewController.swift */; }; B3830CF625545EE400910FE0 /* TagPickerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3830CF425545EE400910FE0 /* TagPickerCell.swift */; }; B3830CF725545EE400910FE0 /* TagPickerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B3830CF525545EE400910FE0 /* TagPickerCell.xib */; }; + B384B5C22E1539D000D023C6 /* AccessibilitySpeechControlsStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B384B5C12E1539C900D023C6 /* AccessibilitySpeechControlsStackView.swift */; }; B385B70E25C03E7E0073CA6F /* PDFExportState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B385B70D25C03E7E0073CA6F /* PDFExportState.swift */; }; B386328626C5499900183062 /* TranslatorsAndStylesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B36A988C2428E059005D5790 /* TranslatorsAndStylesController.swift */; }; B3863FC82AD819AB005082F0 /* EndItemCreationDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3863FC72AD819AB005082F0 /* EndItemCreationDbRequest.swift */; }; @@ -884,6 +891,7 @@ B395EFE725494B2300CEBD9F /* CreatorEditState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B395EFE625494B2300CEBD9F /* CreatorEditState.swift */; }; B395EFEB25494B3200CEBD9F /* CreatorEditActionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B395EFEA25494B3200CEBD9F /* CreatorEditActionHandler.swift */; }; B39649182869B0D0000BCB6C /* ISBNParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39649172869B0D0000BCB6C /* ISBNParser.swift */; }; + B3969A402DE9AAEF00425FF3 /* AccessibilityPopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3969A3F2DE9AAEF00425FF3 /* AccessibilityPopupViewController.swift */; }; B3972689247D403200A8B469 /* UrlDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3972688247D403200A8B469 /* UrlDetector.swift */; }; B3981427257A5A16002C755C /* AnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3981426257A5A16002C755C /* AnnotationView.swift */; }; B398142E257A649D002C755C /* TextContentEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B398142C257A649D002C755C /* TextContentEditCell.swift */; }; @@ -903,6 +911,7 @@ B39D42DF29C0CE7D0035CDA9 /* TagsFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39D42DE29C0CE7D0035CDA9 /* TagsFlowLayout.swift */; }; B39DBFF32D7EF2C600454486 /* FeatureGates.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39DBFF22D7EF2C600454486 /* FeatureGates.swift */; }; B39DBFF42D7EF2C600454486 /* FeatureGates.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39DBFF22D7EF2C600454486 /* FeatureGates.swift */; }; + B39DBFF62D8036A000454486 /* SpeechManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39DBFF52D80369C00454486 /* SpeechManager.swift */; }; B39E0132283276830091CE4A /* WebViewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39E0131283276830091CE4A /* WebViewHandler.swift */; }; B39E013328327CAC0091CE4A /* WebViewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39E0131283276830091CE4A /* WebViewHandler.swift */; }; B39EE32B223A5E3500302E29 /* TestAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39EE32A223A5E3500302E29 /* TestAppDelegate.swift */; }; @@ -1219,6 +1228,7 @@ B3F3D63C255EC98600F310C2 /* AnnotationViewButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F3D63B255EC98600F310C2 /* AnnotationViewButton.swift */; }; B3F3D640255ECA4700F310C2 /* AnnotationViewText.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F3D63F255ECA4700F310C2 /* AnnotationViewText.swift */; }; B3F3D644255ECF3500F310C2 /* AnnotationViewSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F3D643255ECF3500F310C2 /* AnnotationViewSeparator.swift */; }; + B3F451E72E2A57380051E377 /* SpeechVoicePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F451E62E2A57380051E377 /* SpeechVoicePickerView.swift */; }; B3F47E0025B5F550006FA96F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B30B550424B85A6200F94B59 /* Images.xcassets */; }; B3F49FB628B8C3F600A1F3E8 /* AnnotationEditability.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F49FB528B8C3F600A1F3E8 /* AnnotationEditability.swift */; }; B3F4E4EC2A4DAA7D00820718 /* UpdatableObjectSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F4E4EB2A4DAA7D00820718 /* UpdatableObjectSpec.swift */; }; @@ -1238,6 +1248,7 @@ B3F7B0732524A8D500E51377 /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = B3F7B0722524A8D500E51377 /* KeychainSwift */; }; B3F7B0752524A8D800E51377 /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = B3F7B0742524A8D800E51377 /* ZIPFoundation */; }; B3F83808263960FA00E128A6 /* ItemAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F83807263960FA00E128A6 /* ItemAccessory.swift */; }; + B3F874232E2F84B6004A2D71 /* SpeechLanguagePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F874222E2F84B6004A2D71 /* SpeechLanguagePickerView.swift */; }; B3F9A4B82B04C97A00684030 /* HtmlEpubSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F9A4B72B04C97A00684030 /* HtmlEpubSettings.swift */; }; B3F9A4BD2B04CEC300684030 /* ReaderSettingsSegmentedCellContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F9A4BA2B04CEC300684030 /* ReaderSettingsSegmentedCellContentView.swift */; }; B3F9A4BE2B04CEC300684030 /* ReaderSettingsSegmentedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F9A4BB2B04CEC300684030 /* ReaderSettingsSegmentedCell.swift */; }; @@ -1879,9 +1890,13 @@ B372CEE22486512500B423AE /* GroupRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupRequest.swift; sourceTree = ""; }; B372CEE4248670AF00B423AE /* FetchAndStoreGroupSyncAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAndStoreGroupSyncAction.swift; sourceTree = ""; }; B372CEE82486748500B423AE /* MarkGroupForResyncSyncAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkGroupForResyncSyncAction.swift; sourceTree = ""; }; + B37352AE2E140DE70078BB00 /* AccessibilityViewHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityViewHandler.swift; sourceTree = ""; }; + B37352B02E141F990078BB00 /* AccessibilitySpeechControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilitySpeechControlsView.swift; sourceTree = ""; }; B373877228FEA0C7004E5031 /* PDFSidebarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFSidebarViewController.swift; sourceTree = ""; }; B373B1B62BBD748600DCF893 /* DeleteFailedItemsDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFailedItemsDbRequest.swift; sourceTree = ""; }; B373C98E2B1F5431007FD56C /* PDFThumbnailsLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFThumbnailsLayout.swift; sourceTree = ""; }; + B37434C62E38C59A00D8FAC2 /* SetSpeechLanguageDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetSpeechLanguageDbRequest.swift; sourceTree = ""; }; + B37434C92E38C5AB00D8FAC2 /* ReadSpeechLanguageDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadSpeechLanguageDbRequest.swift; sourceTree = ""; }; B3748D1F26566F4800ED05F8 /* ContainerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerViewController.swift; sourceTree = ""; }; B3748D2126566F6900ED05F8 /* ContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerViewController.swift; sourceTree = ""; }; B3756E8E2B835BDC0001CD0A /* IntraDocumentNavigationButtonsHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntraDocumentNavigationButtonsHandler.swift; sourceTree = ""; }; @@ -1926,6 +1941,7 @@ B3830CE8255451DC00910FE0 /* TagPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TagPickerViewController.swift; sourceTree = ""; }; B3830CF425545EE400910FE0 /* TagPickerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagPickerCell.swift; sourceTree = ""; }; B3830CF525545EE400910FE0 /* TagPickerCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TagPickerCell.xib; sourceTree = ""; }; + B384B5C12E1539C900D023C6 /* AccessibilitySpeechControlsStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilitySpeechControlsStackView.swift; sourceTree = ""; }; B385B70D25C03E7E0073CA6F /* PDFExportState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFExportState.swift; sourceTree = ""; }; B3863FC72AD819AB005082F0 /* EndItemCreationDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EndItemCreationDbRequest.swift; sourceTree = ""; }; B3863FC92AD830DE005082F0 /* DeleteCreatorItemDetailDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteCreatorItemDetailDbRequest.swift; sourceTree = ""; }; @@ -1949,6 +1965,7 @@ B395EFE625494B2300CEBD9F /* CreatorEditState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorEditState.swift; sourceTree = ""; }; B395EFEA25494B3200CEBD9F /* CreatorEditActionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatorEditActionHandler.swift; sourceTree = ""; }; B39649172869B0D0000BCB6C /* ISBNParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISBNParser.swift; sourceTree = ""; }; + B3969A3F2DE9AAEF00425FF3 /* AccessibilityPopupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityPopupViewController.swift; sourceTree = ""; }; B3972688247D403200A8B469 /* UrlDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UrlDetector.swift; sourceTree = ""; }; B3981426257A5A16002C755C /* AnnotationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationView.swift; sourceTree = ""; }; B398142C257A649D002C755C /* TextContentEditCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextContentEditCell.swift; sourceTree = ""; }; @@ -1967,6 +1984,7 @@ B39D42D829C0B82F0035CDA9 /* TagFilterCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TagFilterCell.xib; sourceTree = ""; }; B39D42DE29C0CE7D0035CDA9 /* TagsFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsFlowLayout.swift; sourceTree = ""; }; B39DBFF22D7EF2C600454486 /* FeatureGates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureGates.swift; sourceTree = ""; }; + B39DBFF52D80369C00454486 /* SpeechManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechManager.swift; sourceTree = ""; }; B39E0131283276830091CE4A /* WebViewHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewHandler.swift; sourceTree = ""; }; B39EE32A223A5E3500302E29 /* TestAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAppDelegate.swift; sourceTree = ""; }; B3A05E94261492150077CCCC /* UpdateCollectionLastUsedDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateCollectionLastUsedDbRequest.swift; sourceTree = ""; }; @@ -2236,6 +2254,7 @@ B3F3D63B255EC98600F310C2 /* AnnotationViewButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationViewButton.swift; sourceTree = ""; }; B3F3D63F255ECA4700F310C2 /* AnnotationViewText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationViewText.swift; sourceTree = ""; }; B3F3D643255ECF3500F310C2 /* AnnotationViewSeparator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationViewSeparator.swift; sourceTree = ""; }; + B3F451E62E2A57380051E377 /* SpeechVoicePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechVoicePickerView.swift; sourceTree = ""; }; B3F47C00243B339F004F8B1E /* TranslatorsControllerSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslatorsControllerSpec.swift; sourceTree = ""; }; B3F47C04243B4BC0004F8B1E /* Bundled */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Bundled; sourceTree = ""; }; B3F49FB528B8C3F600A1F3E8 /* AnnotationEditability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationEditability.swift; sourceTree = ""; }; @@ -2251,6 +2270,7 @@ B3F6AA392AB30663005BC22E /* AnnotationTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationTool.swift; sourceTree = ""; }; B3F6AA3B2AB30CDA005BC22E /* HtmlEpubReaderAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HtmlEpubReaderAction.swift; sourceTree = ""; }; B3F83807263960FA00E128A6 /* ItemAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemAccessory.swift; sourceTree = ""; }; + B3F874222E2F84B6004A2D71 /* SpeechLanguagePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechLanguagePickerView.swift; sourceTree = ""; }; B3F9A4B72B04C97A00684030 /* HtmlEpubSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HtmlEpubSettings.swift; sourceTree = ""; }; B3F9A4BA2B04CEC300684030 /* ReaderSettingsSegmentedCellContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReaderSettingsSegmentedCellContentView.swift; sourceTree = ""; }; B3F9A4BB2B04CEC300684030 /* ReaderSettingsSegmentedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReaderSettingsSegmentedCell.swift; sourceTree = ""; }; @@ -2428,8 +2448,8 @@ B3D3FCA8267762EC008E243A /* ExportLocaleReader.swift */, B305648123FC051E003304F2 /* Formatter.swift */, B379D9312BB30E6600AF5025 /* FullSyncDebugger.swift */, - B367330C24ACB63300E0CDA8 /* HtmlAttributedStringConverter.swift */, 618404252A4456A9005AAF22 /* IdentifierLookupController.swift */, + B367330C24ACB63300E0CDA8 /* HtmlAttributedStringConverter.swift */, B307A2722704A87D005986B3 /* IdleTimerController.swift */, 61639F842AE03B8500026003 /* InstantPresenter.swift */, B39649172869B0D0000BCB6C /* ISBNParser.swift */, @@ -2452,6 +2472,7 @@ B305646F23FC051E003304F2 /* SecureStorage.swift */, B305646E23FC051E003304F2 /* SessionController.swift */, 61ABA7502A6137D1002A4219 /* ShareableImage.swift */, + B39DBFF52D80369C00454486 /* SpeechManager.swift */, B3593F172668E6A700FA4BB2 /* StyleParserDelegate.swift */, B355B12B2850B6C400BAE2C5 /* TableViewDiffableDataSource.swift */, B36BEC7224485FC700A60552 /* TagColorGenerator.swift */, @@ -2572,6 +2593,7 @@ B34341A4260A16AB00093E63 /* ReadLibraryDbRequest.swift */, B305645023FC051E003304F2 /* ReadSearchDbRequest.swift */, B305646423FC051E003304F2 /* ReadSearchesDbRequest.swift */, + B37434C92E38C5AB00D8FAC2 /* ReadSpeechLanguageDbRequest.swift */, B322B4762673A41200BC3D08 /* ReadStyleDbRequest.swift */, B331F9B4265400D70099F6A6 /* ReadStylesDbRequest.swift */, B305644723FC051E003304F2 /* ReadTagPickerTagsDbRequest.swift */, @@ -2580,10 +2602,12 @@ B349182A25E00771006C3313 /* ReadVersionDbRequest.swift */, B3100920272C0960003FC743 /* ReadWebDavDeletionsDbRequest.swift */, B35DD74229813AA6004CC34D /* RemoveItemFromParentDbRequest.swift */, + 617999712D8089200051D35E /* RenameAttachmentFilenameDbRequest.swift */, B3863FCD2AD830FE005082F0 /* ReorderCreatorsItemDetailDbRequest.swift */, B361C2B329DECB220035BF7E /* ResetSettingsVersionDbRequest.swift */, B353F1FA242E21880062EE24 /* ResetTranslatorsDbRequest.swift */, B3588C6825FF7A800049D484 /* SetCollectionCollapsedDbRequest.swift */, + B37434C62E38C59A00D8FAC2 /* SetSpeechLanguageDbRequest.swift */, B3E8B24E27DA3969001825F8 /* SplitAnnotationsDbRequest.swift */, B305646723FC051E003304F2 /* StoreCollectionsDbRequest.swift */, B305645323FC051E003304F2 /* StoreGroupDbRequest.swift */, @@ -2601,7 +2625,6 @@ B3D84BEC27917E3D005DDD7C /* UpdateCreatorSummaryFormatDbRequest.swift */, B305644E23FC051E003304F2 /* UpdateItemLocaleDbRequest.swift */, B305645F23FC051E003304F2 /* UpdateVersionsDbRequest.swift */, - 617999712D8089200051D35E /* RenameAttachmentFilenameDbRequest.swift */, ); path = Requests; sourceTree = ""; @@ -4022,6 +4045,10 @@ B3DCDF00240912060039ED0D /* Views */ = { isa = PBXGroup; children = ( + B3969A3F2DE9AAEF00425FF3 /* AccessibilityPopupViewController.swift */, + B384B5C12E1539C900D023C6 /* AccessibilitySpeechControlsStackView.swift */, + B37352B02E141F990078BB00 /* AccessibilitySpeechControlsView.swift */, + B37352AE2E140DE70078BB00 /* AccessibilityViewHandler.swift */, B3DCDF03240912060039ED0D /* ActivityIndicatorView.swift */, B347F2B924DC4D5D000D5FF6 /* CapHeightLabel.swift */, B3D58D6A25EE437700D8FA31 /* CircularProgressView.swift */, @@ -4054,6 +4081,8 @@ B361820E24C9B9E800B30D56 /* SelectableTextField.swift */, B3DCDF1A24091EBE0039ED0D /* SinglePickerRow.swift */, B3DCDF1C24091EC40039ED0D /* SinglePickerView.swift */, + B3F874222E2F84B6004A2D71 /* SpeechLanguagePickerView.swift */, + B3F451E62E2A57380051E377 /* SpeechVoicePickerView.swift */, B32B4F942475544700F78A05 /* SyncToolbarController.swift */, B3830CF425545EE400910FE0 /* TagPickerCell.swift */, B3830CF525545EE400910FE0 /* TagPickerCell.xib */, @@ -5072,11 +5101,13 @@ B3A95DAA29194BDE00BCCF11 /* DashedView.swift in Sources */, B3593F1C2668E86100FA4BB2 /* SyncStylesDbRequest.swift in Sources */, B3E9180C25ECE30A002B77AF /* CoreGraphics+Extensions.swift in Sources */, + B37434C72E38C5A800D8FAC2 /* SetSpeechLanguageDbRequest.swift in Sources */, B30565CD23FC051E003304F2 /* InitializeCustomLibrariesDbRequest.swift in Sources */, B3866A5A2417C1C7006693C4 /* Coordinator.swift in Sources */, B305661023FC051E003304F2 /* SchemaRequest.swift in Sources */, B305660223FC051E003304F2 /* ApiClient.swift in Sources */, B312BB4125519DD30023300A /* ItemDetailLayout.swift in Sources */, + B37352B12E141F9F0078BB00 /* AccessibilitySpeechControlsView.swift in Sources */, B331F9B5265400D70099F6A6 /* ReadStylesDbRequest.swift in Sources */, B39D33712400150B00EF2ACB /* CreateAttachmentsDbRequest.swift in Sources */, B3A081E125D2D8050088EC24 /* CollectionEditHostingViewController.swift in Sources */, @@ -5084,6 +5115,7 @@ B336FE812A2F6D9E00B52F4A /* UploadFixSyncAction.swift in Sources */, B3486B8B26CFAFEA0036A267 /* SingleCitationAction.swift in Sources */, B3593F3C241A61C700760E20 /* ItemsSortType.swift in Sources */, + B37434CA2E38C5B100D8FAC2 /* ReadSpeechLanguageDbRequest.swift in Sources */, B372CEE92486748500B423AE /* MarkGroupForResyncSyncAction.swift in Sources */, B340831328F983CF0087D1A1 /* URL+Extensions.swift in Sources */, B378F4C9242CC8EF00B88A05 /* Translator.swift in Sources */, @@ -5160,6 +5192,7 @@ 61EB05B42C9D8EA200152482 /* CreateReaderAnnotationsDbRequest.swift in Sources */, B3229FD128C0A07500DAF3B7 /* EditAnnotationRectsDbRequest.swift in Sources */, B3DF9AD22747AAD2007933CB /* ApiRequest.swift in Sources */, + B384B5C22E1539D000D023C6 /* AccessibilitySpeechControlsStackView.swift in Sources */, 615FD8772C8B475A00808C1D /* ReaderCoordinator.swift in Sources */, B3DCDF0E240912500039ED0D /* SinglePickerActionHandler.swift in Sources */, B3593F162668E29C00FA4BB2 /* Style.swift in Sources */, @@ -5426,6 +5459,7 @@ B3DAF84D2AC5AA5C00F9AB6A /* PDFDocumentAnnotation.swift in Sources */, B361C2B429DECB220035BF7E /* ResetSettingsVersionDbRequest.swift in Sources */, B30565B623FC051E003304F2 /* StoreItemsDbResponseRequest.swift in Sources */, + B37352AF2E140DF10078BB00 /* AccessibilityViewHandler.swift in Sources */, B395EFEB25494B3200CEBD9F /* CreatorEditActionHandler.swift in Sources */, B30565E623FC051E003304F2 /* SchemaController.swift in Sources */, B339459126DE6C2A00E59A02 /* AttachmentFileDeletedNotification.swift in Sources */, @@ -5513,6 +5547,7 @@ B3DEAAA728AD01CA00F72D90 /* URLSession+Extensions.swift in Sources */, B36FD9B32A7929C8002D77E8 /* FontSizeCell.swift in Sources */, B357A28C285B73BD00E73CA1 /* ScannerState.swift in Sources */, + B3969A402DE9AAEF00425FF3 /* AccessibilityPopupViewController.swift in Sources */, B3E8FE5A2714325200F51458 /* SavingSettingsActionHandler.swift in Sources */, B30566B623FC051F003304F2 /* DeletionsResponse.swift in Sources */, B30566C423FC051F003304F2 /* DeleteBatch.swift in Sources */, @@ -5532,6 +5567,7 @@ B34341B4260A496200093E63 /* ReadCollectionAndLibraryDbRequest.swift in Sources */, B30566BA23FC051F003304F2 /* Defaults.swift in Sources */, B3325F6F27B41D69007C7137 /* CollectionTree.swift in Sources */, + B39DBFF62D8036A000454486 /* SpeechManager.swift in Sources */, B30565E423FC051E003304F2 /* RealmDbStorage.swift in Sources */, B3E8FE742714344D00F51458 /* SettingsListView.swift in Sources */, B3343079282A563B00FB41BC /* NSUserActivity+Activities.swift in Sources */, @@ -5564,6 +5600,7 @@ B3A71F4D2EEC39BA0006A737 /* AnnotationToolsSettingsActionHandler.swift in Sources */, B3E8FE8927143BDD00F51458 /* SyncSettingsView.swift in Sources */, B3593F7A241A76E600760E20 /* CollectionEditState.swift in Sources */, + B3F874232E2F84B6004A2D71 /* SpeechLanguagePickerView.swift in Sources */, B3C6AB28248E1B720009AC96 /* SyncBatchProcessor.swift in Sources */, B351BD0E25EF7E78000451E2 /* ItemAction.swift in Sources */, B30565E823FC051E003304F2 /* CreatorSummaryFormatter.swift in Sources */, @@ -5757,6 +5794,7 @@ 618404262A4456A9005AAF22 /* IdentifierLookupController.swift in Sources */, B305662223FC051F003304F2 /* StoreVersionSyncAction.swift in Sources */, B3BC25CD247E6BA000AC27B5 /* DateParser.swift in Sources */, + B3F451E72E2A57380051E377 /* SpeechVoicePickerView.swift in Sources */, B305662523FC051F003304F2 /* RevertLibraryUpdatesSyncAction.swift in Sources */, B361820D24C9B9D900B30D56 /* NoRotationHostingController.swift in Sources */, B3ED79372C9C6678004F5C9A /* ItemsTableViewObject.swift in Sources */, @@ -6092,6 +6130,7 @@ B3DCDF19240918E50039ED0D /* ActivityIndicatorView.swift in Sources */, B3593F1A2668E75700FA4BB2 /* StyleParserDelegate.swift in Sources */, B32EBFC6276A89390003897E /* BackgroundUpload.swift in Sources */, + B37434CB2E38C5B100D8FAC2 /* ReadSpeechLanguageDbRequest.swift in Sources */, B341C8D425CBFF8A005562E5 /* LibraryIdentifier.swift in Sources */, B30566FF23FC0869003304F2 /* MarkItemsAsTrashedDbRequest.swift in Sources */, B305671D23FC08E2003304F2 /* SyncVersionsDbRequest.swift in Sources */, @@ -6218,6 +6257,7 @@ B30566FC23FC0862003304F2 /* MarkCollectionAndItemsAsDeletedDbRequest.swift in Sources */, B3F9A4CC2B04F2AC00684030 /* WebViewEncoder.swift in Sources */, B3D59F142A38A6C100F6BB7D /* RevertLibraryFilesSyncAction.swift in Sources */, + B37434C82E38C5A800D8FAC2 /* SetSpeechLanguageDbRequest.swift in Sources */, B377F2A02493725E00022943 /* UrlDetector.swift in Sources */, B305670A23FC08B5003304F2 /* ReadCollectionsDbRequest.swift in Sources */, B305672A23FC0914003304F2 /* LoadUploadDataSyncAction.swift in Sources */, diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 369bac4a3..53108624a 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -583,7 +583,6 @@ "accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; "accessibility.pdf.tags_hint" = "Double-tap to edit tags"; "accessibility.pdf.selected" = "Selected"; -"accessibility.pdf.open_reader" = "Open reading mode"; "accessibility.pdf.search_pdf" = "Search PDF"; "accessibility.pdf.redo" = "Redo"; "accessibility.pdf.undo" = "Undo"; @@ -591,3 +590,13 @@ "accessibility.pdf.show_more_tools" = "Show more"; "accessibility.htmlepub.search_html" = "Search Website"; "accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Controllers/Database/Requests/ReadSpeechLanguageDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadSpeechLanguageDbRequest.swift new file mode 100644 index 000000000..edbeb8344 --- /dev/null +++ b/Zotero/Controllers/Database/Requests/ReadSpeechLanguageDbRequest.swift @@ -0,0 +1,22 @@ +// +// ReadSpeechLanguageDbRequest.swift +// Zotero +// +// Created by Michal Rentka on 29.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import Foundation + +import RealmSwift + +struct ReadSpeechLanguageDbRequest: DbResponseRequest { + let key: String + let libraryId: LibraryIdentifier + + var needsWrite: Bool { return false } + + func process(in database: Realm) throws -> String? { + return database.objects(RItem.self).filter(.key(key, in: libraryId)).first?.speechLanguage + } +} diff --git a/Zotero/Controllers/Database/Requests/SetSpeechLanguageDbRequest.swift b/Zotero/Controllers/Database/Requests/SetSpeechLanguageDbRequest.swift new file mode 100644 index 000000000..98f61af7c --- /dev/null +++ b/Zotero/Controllers/Database/Requests/SetSpeechLanguageDbRequest.swift @@ -0,0 +1,24 @@ +// +// SetSpeechLanguageDbRequest.swift +// Zotero +// +// Created by Michal Rentka on 29.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import Foundation + +import RealmSwift + +struct SetSpeechLanguageDbRequest: DbRequest { + let key: String + let libraryId: LibraryIdentifier + let language: String? + + var needsWrite: Bool { return true } + + func process(in database: Realm) throws { + guard let item = database.objects(RItem.self).filter(.key(key, in: libraryId)).first else { return } + item.speechLanguage = language + } +} diff --git a/Zotero/Controllers/PDFWorkerController.swift b/Zotero/Controllers/PDFWorkerController.swift index 32200adec..8e83a412e 100644 --- a/Zotero/Controllers/PDFWorkerController.swift +++ b/Zotero/Controllers/PDFWorkerController.swift @@ -16,9 +16,9 @@ import RxSwift final class PDFWorkerController { // MARK: Types struct PDFWork: Hashable { - enum Kind { + enum Kind: Hashable { case recognizer - case fullText + case fullText(pages: [Int]) } let file: FileData @@ -44,13 +44,21 @@ final class PDFWorkerController { private unowned let fileStorage: FileStorage private let disposeBag: DisposeBag - weak var webViewProvider: WebViewProvider? + weak var webViewProvider: WebViewProvider? { + didSet { + guard webViewProvider !== oldValue, webViewProvider != nil else { return } + accessQueue.async(flags: .barrier) { [weak self] in + self?.preloadPDFWorkerIfIdle() + } + } + } // Accessed only via accessQueue private static let maxConcurrentPDFWorkers: Int = 1 private var queue: [PDFWork] = [] private var subjectsByPDFWork: [PDFWork: PublishSubject] = [:] private var pdfWorkerWebViewHandlersByPDFWork: [PDFWork: PDFWorkerWebViewHandler] = [:] + private var preloadedPDFWorkerWebViewHandler: PDFWorkerWebViewHandler? // MARK: Object Lifecycle init(fileStorage: FileStorage) { @@ -92,12 +100,11 @@ final class PDFWorkerController { func start(work: PDFWork, subject: PublishSubject) { var pdfWorkerWebViewHandler = pdfWorkerWebViewHandlersByPDFWork[work] if pdfWorkerWebViewHandler == nil { - DispatchQueue.main.sync { [weak webViewProvider] in - guard let webViewProvider else { return } - let configuration = WKWebViewConfiguration() - configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") - let webView = webViewProvider.addWebView(configuration: configuration) - pdfWorkerWebViewHandler = PDFWorkerWebViewHandler(webView: webView, fileStorage: fileStorage) + if let preloadedPDFWorkerWebViewHandler { + pdfWorkerWebViewHandler = preloadedPDFWorkerWebViewHandler + self.preloadedPDFWorkerWebViewHandler = nil + } else { + pdfWorkerWebViewHandler = createPDFWorkerWebViewHandler() } pdfWorkerWebViewHandlersByPDFWork[work] = pdfWorkerWebViewHandler } @@ -107,14 +114,30 @@ final class PDFWorkerController { return } + guard let workFileUrl = copyFileForPDFWorker(file: work.file, handler: pdfWorkerWebViewHandler) else { + cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .failed))) } + return + } + setupObserver(for: pdfWorkerWebViewHandler) subject.on(.next(Update(work: work, kind: .inProgress))) switch work.kind { case .recognizer: - pdfWorkerWebViewHandler.recognize(file: work.file) + pdfWorkerWebViewHandler.recognize(fileURL: workFileUrl) + + case .fullText(let pages): + pdfWorkerWebViewHandler.getFullText(fileURL: workFileUrl, pages: pages) + } - case .fullText: - pdfWorkerWebViewHandler.getFullText(file: work.file) + func copyFileForPDFWorker(file: FileData, handler: PDFWorkerWebViewHandler) -> URL? { + let destination = handler.temporaryDirectory.copy(withName: file.name, ext: file.ext) + do { + try fileStorage.copy(from: file.createUrl().path, to: destination) + } catch { + DDLogError("PDFWorkerController: failed to copy file for PDF worker - \(error)") + return nil + } + return destination.createUrl() } func setupObserver(for pdfWorkerWebViewHandler: PDFWorkerWebViewHandler) { @@ -175,6 +198,67 @@ final class PDFWorkerController { controller.pdfWorkerWebViewHandlersByPDFWork.removeValue(forKey: work)?.removeFromSuperviewAsynchronously() completion?(subject) controller.startWorkIfNeeded() + controller.preloadPDFWorkerIfIdle() + } + } + + private func preloadPDFWorkerIfIdle() { + guard preloadedPDFWorkerWebViewHandler == nil, pdfWorkerWebViewHandlersByPDFWork.isEmpty else { return } + preloadedPDFWorkerWebViewHandler = createPDFWorkerWebViewHandler() + } + + private func createPDFWorkerWebViewHandler() -> PDFWorkerWebViewHandler? { + guard let temporaryDirectory = prepareTemporaryWorkerDirectory() else { return nil } + let cleanupClosure: () -> Void = { [weak self] in + self?.accessQueue.async { [weak self] in + self?.removeTemporaryWorkerDirectory(temporaryDirectory) + } + } + + var pdfWorkerWebViewHandler: PDFWorkerWebViewHandler? + DispatchQueue.main.sync { [weak self] in + guard let self, let webViewProvider else { return } + let configuration = WKWebViewConfiguration() + configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") + let webView = webViewProvider.addWebView(configuration: configuration) + pdfWorkerWebViewHandler = PDFWorkerWebViewHandler(webView: webView, temporaryDirectory: temporaryDirectory, cleanup: cleanupClosure) + } + if pdfWorkerWebViewHandler == nil { + removeTemporaryWorkerDirectory(temporaryDirectory) + } + return pdfWorkerWebViewHandler + } + + private func prepareTemporaryWorkerDirectory() -> File? { + guard let workerHtmlUrl = Bundle.main.url(forResource: "worker", withExtension: "html") else { + DDLogError("PDFWorkerController: worker.html not found") + return nil + } + guard let workerJsUrl = Bundle.main.url(forResource: "worker", withExtension: "js", subdirectory: "Bundled/pdf_worker") else { + DDLogError("PDFWorkerController: worker.js not found") + return nil + } + let temporaryDirectory = Files.temporaryDirectory + do { + try fileStorage.copy(from: workerHtmlUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "html")) + try fileStorage.copy(from: workerJsUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "js")) + let cmapsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "cmaps") + try fileStorage.copyContents(of: cmapsDirectory, to: temporaryDirectory.appending(relativeComponent: "cmaps")) + let standardFontsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "standard_fonts") + try fileStorage.copyContents(of: standardFontsDirectory, to: temporaryDirectory.appending(relativeComponent: "standard_fonts")) + } catch { + DDLogError("PDFWorkerController: failed to prepare worker directory - \(error)") + removeTemporaryWorkerDirectory(temporaryDirectory) + return nil + } + return temporaryDirectory + } + + private func removeTemporaryWorkerDirectory(_ directory: File) { + do { + try fileStorage.remove(directory) + } catch { + DDLogError("PDFWorkerController: failed to remove worker directory - \(error)") } } } diff --git a/Zotero/Controllers/SpeechManager.swift b/Zotero/Controllers/SpeechManager.swift new file mode 100644 index 000000000..df30ce01c --- /dev/null +++ b/Zotero/Controllers/SpeechManager.swift @@ -0,0 +1,394 @@ +// +// SpeechManager.swift +// Zotero +// +// Created by Michal Rentka on 11.03.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import AVFoundation +import NaturalLanguage + +import CocoaLumberjackSwift +import RxCocoa + +protocol SpeechmanagerDelegate: AnyObject { + associatedtype Index: Hashable + + func getCurrentPageIndex() -> Index + func getNextPageIndex(from currentPageIndex: Index) -> Index? + func getPreviousPageIndex(from currentPageIndex: Index) -> Index? + func text(for indices: [Index], completion: @escaping ([Index: String]?) -> Void) + func moved(to pageIndex: Index) +} + +final class SpeechManager: NSObject, AVSpeechSynthesizerDelegate { + enum State { + case speaking, paused, stopped, loading + + var isStopped: Bool { + switch self { + case .speaking, .loading, .paused: + return false + + case .stopped: + return true + } + } + } + + private enum Error: Swift.Error { + case cantGetText + } + + private struct SpeechData { + let startIndex: Int + let speakingRange: NSRange + + func copy(with localRange: NSRange) -> SpeechData { + return SpeechData(startIndex: startIndex, speakingRange: localRange) + } + + var globalRange: NSRange { + return NSRange(location: startIndex + speakingRange.location, length: speakingRange.length) + } + } + + private struct PageData { + // Text to read + let text: String + // Voice used for this page + let voice: AVSpeechSynthesisVoice + } + + private let synthesizer: AVSpeechSynthesizer + let state: BehaviorRelay + + private var speech: SpeechData? + private var cachedPages: [Delegate.Index: PageData] + private var currentIndex: Delegate.Index? + private var speechRateModifier: Float + private var ignoreFinishCallCount = 0 + private var shouldReloadUtteranceOnResume = false + private weak var delegate: Delegate? + private lazy var paragraphRegex: NSRegularExpression? = { + return try? NSRegularExpression(pattern: "[\r\n]{1,}") + }() + var isSpeaking: Bool { + return synthesizer.isSpeaking + } + var isPaused: Bool { + return synthesizer.isPaused + } + var currentVoice: AVSpeechSynthesisVoice? { + return currentIndex.flatMap({ cachedPages[$0] })?.voice + } + private var overrideLanguage: String? + + init(delegate: Delegate, speechRateModifier: Float, voiceLanguage: String? = nil) { + cachedPages = [:] + self.speechRateModifier = speechRateModifier + overrideLanguage = voiceLanguage + synthesizer = AVSpeechSynthesizer() + state = BehaviorRelay(value: .stopped) + self.delegate = delegate + super.init() + synthesizer.delegate = self + } + + // MARK: - Actions + + func start() { + guard let delegate else { + DDLogError("SpeechManager: can't get delegate") + return + } + + let index = delegate.getCurrentPageIndex() + if let page = cachedPages[index] { + go(to: page, pageIndex: index, reportPageChange: false) + return + } + + state.accept(.loading) + getData(for: [index], from: delegate) { [weak self] pages in + guard let self, let pages, let page = pages[index] else { + self?.state.accept(.stopped) + return + } + cachedPages = pages + guard state.value == .loading else { return } + go(to: page, pageIndex: index, reportPageChange: false) + } + } + + func pause() { + guard synthesizer.isSpeaking else { return } + synthesizer.pauseSpeaking(at: .word) + } + + func resume() { + guard synthesizer.isPaused else { return } + + if !shouldReloadUtteranceOnResume { + synthesizer.continueSpeaking() + } else { + reloadUtterance() + } + } + + func stop() { + guard synthesizer.isSpeaking || synthesizer.isPaused || state.value == .loading else { return } + if state.value == .loading { + state.accept(.stopped) + } else { + // Ignore finish delegate, which would move us to another page + ignoreFinishCallCount = 1 + synthesizer.stopSpeaking(at: .immediate) + state.accept(.stopped) + } + } + + func set(voice: AVSpeechSynthesisVoice) { + Defaults.shared.defaultVoiceForLanguage[voice.baseLanguage] = voice.identifier + + guard let currentVoice else { return } + + let newBaseLanguage = voice.baseLanguage + if currentVoice.baseLanguage != newBaseLanguage { + set(overrideLanguage: newBaseLanguage, voice: voice) + } else { + for (key, value) in cachedPages { + guard value.voice.baseLanguage == newBaseLanguage else { continue } + cachedPages[key] = PageData(text: value.text, voice: voice) + } + } + utteranceChanged() + + func set(overrideLanguage: String, voice: AVSpeechSynthesisVoice) { + self.overrideLanguage = overrideLanguage + for (key, value) in cachedPages { + cachedPages[key] = PageData(text: value.text, voice: voice) + } + } + } + + func set(rateModifier: Float) { + speechRateModifier = rateModifier + utteranceChanged() + } + + private func utteranceChanged() { + if synthesizer.isPaused { + shouldReloadUtteranceOnResume = true + } else if synthesizer.isSpeaking { + reloadUtterance() + } + } + + private func reloadUtterance() { + guard let currentIndex, let page = cachedPages[currentIndex], let speech else { return } + if synthesizer.isSpeaking { + synthesizer.pauseSpeaking(at: .immediate) + } + let text = String(page.text[page.text.index(page.text.startIndex, offsetBy: speech.globalRange.location).. Void) { + delegate.text(for: indices) { texts in + guard let texts, texts.count == indices.count else { + completion(nil) + return + } + + var pages: [Delegate.Index: PageData] = [:] + for index in indices { + guard let text = texts[index] else { + completion(nil) + return + } + pages[index] = PageData(text: text, voice: voice(for: text)) + } + completion(pages) + } + + func voice(for text: String) -> AVSpeechSynthesisVoice { + if let overrideLanguage { + return findVoice(for: overrideLanguage) + } + + let recognizer = NLLanguageRecognizer() + recognizer.processString(text) + let language = recognizer.dominantLanguage?.rawValue ?? "en" + return findVoice(for: language) + } + } + + private func findVoice(for language: String) -> AVSpeechSynthesisVoice { + let voiceId = Defaults.shared.defaultVoiceForLanguage[language] + return AVSpeechSynthesisVoice.speechVoices().first(where: isProperVoice) ?? AVSpeechSynthesisVoice(identifier: "en-US")! + + func isProperVoice(_ voice: AVSpeechSynthesisVoice) -> Bool { + if let voiceId { + return voice.identifier == voiceId + } + return voice.language.starts(with: language) + } + } + + private func go(to page: PageData, pageIndex: Delegate.Index, speechStartIndex: Int? = nil, reportPageChange: Bool = true) { + let text: String + if let index = speechStartIndex { + text = String(page.text[page.text.index(page.text.startIndex, offsetBy: index).. Int? { + guard let paragraphRegex else { return nil } + let matches = paragraphRegex.matches(in: page.text, range: NSRange(page.text.index(page.text.startIndex, offsetBy: speechRange.location + speechRange.length)..., in: page.text)) + guard let range = matches.first?.range else { return nil } + return range.location + range.length + } + } + + func backward() { + guard let currentIndex, let currentPage = cachedPages[currentIndex], let speech else { return } + + if let index = findPreviousIndex(in: currentPage.text, endIndex: currentPage.text.index(currentPage.text.startIndex, offsetBy: speech.globalRange.location)) { + DDLogInfo("SpeechManager: backward to \(index); \(speech.startIndex); \(speech.speakingRange.location); \(speech.speakingRange.length)") + skip(to: index, on: currentPage) + } else if speech.startIndex != 0 { + skip(to: 0, on: currentPage) + } else if let previousIndex = delegate?.getPreviousPageIndex(from: currentIndex), + let previousPage = cachedPages[previousIndex], + let speechIndex = findPreviousIndex(in: previousPage.text, endIndex: previousPage.text.endIndex) { + go(to: previousPage, pageIndex: previousIndex, speechStartIndex: speechIndex) + } else { + stop() + } + + func findPreviousIndex(in text: String, endIndex: String.Index) -> Int? { + guard let paragraphRegex else { return nil } + let range = NSRange(text.startIndex.. 1 { + let matchRange = matches[matches.count - 2].range + return matchRange.location + matchRange.length + } + return nil + } + } + + private func cleanup() { + speech = nil + currentIndex = nil + cachedPages = [:] + } + + // MARK: - AVSpeechSynthesizerDelegate + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance: AVSpeechUtterance) { + cleanup() + state.accept(.stopped) + } + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) { + state.accept(.paused) + } + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) { + state.accept(.speaking) + } + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) { + state.accept(.speaking) + } + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { + guard ignoreFinishCallCount <= 0 else { + ignoreFinishCallCount -= 1 + return + } + + if let currentIndex, let nextIndex = delegate?.getNextPageIndex(from: currentIndex), let page = cachedPages[nextIndex] { + go(to: page, pageIndex: nextIndex) + } else { + cleanup() + state.accept(.stopped) + } + } + + func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) { + guard currentIndex != nil && characterRange.length > 0 else { return } + speech = speech?.copy(with: characterRange) + } +} + +extension AVSpeechSynthesisVoice { + var baseLanguage: String { + if let index = language.firstIndex(of: "-") { + return String(language[language.startIndex.. Void)? let observable: PublishSubject> - init(webView: WKWebView, fileStorage: FileStorage) { - self.fileStorage = fileStorage + init(webView: WKWebView, temporaryDirectory: File, cleanup: (() -> Void)?) { + self.temporaryDirectory = temporaryDirectory + self.cleanup = cleanup observable = PublishSubject() disposeBag = DisposeBag() @@ -51,73 +47,52 @@ final class PDFWorkerWebViewHandler: WebViewHandler { } deinit { - guard let temporaryDirectory else { return } - try? fileStorage.remove(temporaryDirectory) + cleanup?() } override func initializeWebView() -> Single<()> { DDLogInfo("PDFWorkerWebViewHandler: initialize web view") - return createTemporaryWorker() - .flatMap { _ in - return loadIndex() - } - - func createTemporaryWorker() -> Single<()> { - guard let workerHtmlUrl = Bundle.main.url(forResource: "worker", withExtension: "html") else { - return .error(Error.cantFindFile("worker.html")) - } - guard let workerJsUrl = Bundle.main.url(forResource: "worker", withExtension: "js", subdirectory: "Bundled/pdf_worker") else { - return .error(Error.cantFindFile("worker.js")) - } - let temporaryDirectory = Files.temporaryDirectory - self.temporaryDirectory = temporaryDirectory - do { - try fileStorage.copy(from: workerHtmlUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "html")) - try fileStorage.copy(from: workerJsUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "js")) - let cmapsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "cmaps") - try fileStorage.copyContents(of: cmapsDirectory, to: temporaryDirectory.appending(relativeComponent: "cmaps")) - let standardFontsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "standard_fonts") - try fileStorage.copyContents(of: standardFontsDirectory, to: temporaryDirectory.appending(relativeComponent: "standard_fonts")) - } catch let error { - return .error(error) - } - return Single.just(Void()) - } - - func loadIndex() -> Single<()> { - guard let temporaryDirectory else { - return .error(Error.cantFindFile("temporary directory")) - } - let indexUrl = temporaryDirectory.copy(withName: "worker", ext: "html").createUrl() - return load(fileUrl: indexUrl) - } + return load(fileUrl: temporaryDirectory.copy(withName: "worker", ext: "html").createUrl()) } - private func performPDFWorkerOperation(file: FileData, operationName: String, jsFunction: String) { + private func performPDFWorkerOperation(fileURL: URL, operationName: String, jsFunction: String, additionalParams: [String] = []) { performAfterInitialization() + .observe(on: MainScheduler.instance) .flatMap { [weak self] _ -> Single in - guard let self, let temporaryDirectory else { return .never() } - do { - try fileStorage.copy(from: file.createUrl().path, to: temporaryDirectory.copy(withName: file.name, ext: file.ext)) - } catch let error { - return .error(error) - } + guard let self else { return .never() } DDLogInfo("PDFWorkerWebViewHandler: call \(operationName) js") - return call(javascript: "\(jsFunction)('\(file.fileName)');") + let relativePath = fileURL.lastPathComponent + var javascript = "\(jsFunction)('\(escapeJavaScriptString(relativePath))'" + if !additionalParams.isEmpty { + javascript += ", " + additionalParams.joined(separator: ", ") + } + javascript += ");" + return call(javascript: javascript) } .subscribe(onFailure: { [weak self] error in DDLogError("PDFWorkerWebViewHandler: \(operationName) failed - \(error)") self?.observable.on(.next(.failure(error))) }) .disposed(by: disposeBag) + + func escapeJavaScriptString(_ string: String) -> String { + return string + .replacingOccurrences(of: "\\", with: "\\\\") + .replacingOccurrences(of: "'", with: "\\'") + } } - func recognize(file: FileData) { - performPDFWorkerOperation(file: file, operationName: "recognize", jsFunction: "recognize") + func recognize(fileURL: URL) { + performPDFWorkerOperation(fileURL: fileURL, operationName: "recognize", jsFunction: "recognize") } - func getFullText(file: FileData) { - performPDFWorkerOperation(file: file, operationName: "getFullText", jsFunction: "getFullText") + func getFullText(fileURL: URL, pages: [Int]?) { + performPDFWorkerOperation( + fileURL: fileURL, + operationName: "getFullText", + jsFunction: "getFullText", + additionalParams: pages.flatMap({ ["[\($0.map({ "\($0)" }).joined(separator: ","))]"] }) ?? [] + ) } /// Communication with JS in `webView`. The `webView` sends a message through one of the registered `JSHandlers`, which is received here. diff --git a/Zotero/Controllers/Web View Handling/worker.html b/Zotero/Controllers/Web View Handling/worker.html index c9610f1df..09b78c80e 100644 --- a/Zotero/Controllers/Web View Handling/worker.html +++ b/Zotero/Controllers/Web View Handling/worker.html @@ -65,10 +65,10 @@ } } -async function getFullText(filePath) { +async function getFullText(filePath, pageIndexes) { try { let buf = await fetchLocalFile(filePath) - let fulltext = await query('getFulltext', { buf }, [buf]); + let fulltext = await query('getFulltext', { buf, pageIndexes }, [buf]); webkit.messageHandlers.fullTextHandler.postMessage({"fullText": fulltext}); } catch (error) { log(`error: ${error}`); diff --git a/Zotero/Info.plist b/Zotero/Info.plist index 22bf2eaf1..3f0c8eab0 100644 --- a/Zotero/Info.plist +++ b/Zotero/Info.plist @@ -133,5 +133,7 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIDesignRequiresCompatibility + diff --git a/Zotero/Models/Database/Database.swift b/Zotero/Models/Database/Database.swift index fe80621a4..9416879ac 100644 --- a/Zotero/Models/Database/Database.swift +++ b/Zotero/Models/Database/Database.swift @@ -13,7 +13,7 @@ import RealmSwift import Network struct Database { - private static let schemaVersion: UInt64 = 49 + private static let schemaVersion: UInt64 = 50 static func mainConfiguration(url: URL, fileStorage: FileStorage) -> Realm.Configuration { var config = Realm.Configuration( diff --git a/Zotero/Models/Database/RItem.swift b/Zotero/Models/Database/RItem.swift index f31cbc840..2fd1bdc30 100644 --- a/Zotero/Models/Database/RItem.swift +++ b/Zotero/Models/Database/RItem.swift @@ -144,6 +144,8 @@ final class RItem: Object { @Persisted var deleted: Bool /// Comment (for annotations) or note (for notes) text without HTML tags @Persisted var htmlFreeContent: String? + /// Selected override speech language for this item + @Persisted var speechLanguage: String? var doi: String? { return self.fields.filter(.key(FieldKeys.Item.doi)).first.flatMap({ field -> String? in diff --git a/Zotero/Models/Defaults.swift b/Zotero/Models/Defaults.swift index c749bec1e..84e53f67e 100644 --- a/Zotero/Models/Defaults.swift +++ b/Zotero/Models/Defaults.swift @@ -158,6 +158,14 @@ final class Defaults { var htmlEpubAnnotationTools: [AnnotationToolButton] #endif + // MARK: - Speech + + @UserDefault(key: "SpeechDefaultVoiceForLanguage", defaultValue: [:]) + var defaultVoiceForLanguage: [String: String] + + @UserDefault(key: "SpeechRateModifier", defaultValue: 1) + var speechRateModifier: Float + // MARK: - Citation / Bibliography Export @UserDefault(key: "exportStyleId", defaultValue: "http://www.zotero.org/styles/chicago-note-bibliography", defaults: .standard) diff --git a/Zotero/Models/FeatureGates.swift b/Zotero/Models/FeatureGates.swift index 800479f51..32d87c50d 100644 --- a/Zotero/Models/FeatureGates.swift +++ b/Zotero/Models/FeatureGates.swift @@ -17,15 +17,17 @@ struct FeatureGates: OptionSet { static let pdfWorker = FeatureGates(rawValue: 1 << 1) static let htmlEpubReader = FeatureGates(rawValue: 1 << 2) static let downloadFilesAtSync = FeatureGates(rawValue: 1 << 3) + static let speech = FeatureGates(rawValue: 1 << 4) static var enabled: FeatureGates { - var gates: FeatureGates = [] + var gates: FeatureGates = [.speech] #if FEATURE_GATE_ALL gates.insert(.multipleOpenItems) gates.insert(.htmlEpubReader) gates.insert(.pdfWorker) gates.insert(.downloadFilesAtSync) + gates.insert(.speech) #else #if FEATURE_GATE_HTML_EPUB_READER gates.insert(.htmlEpubReader) @@ -42,6 +44,11 @@ struct FeatureGates: OptionSet { #if FEATURE_GATE_DOWNLOAD_FILES_AT_SYNC gates.insert(.downloadFilesAtSync) #endif + +#if FEATURE_GATE_SPEECH + gates.insert(.speech) + gates.insert(.pdfWorker) +#endif #endif return gates diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift index 64511d9fe..3892dfd14 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift @@ -452,6 +452,9 @@ extension HtmlEpubReaderViewController: AnnotationToolbarHandlerDelegate { func setDocumentInterface(hidden: Bool) { } + + func annotationToolbarWillChange(state: AnnotationToolbarHandler.State, statusBarVisible: Bool) { + } func topDidChange(forToolbarState state: AnnotationToolbarHandler.State) { guard let annotationToolbarHandler, let annotationToolbarController else { return } diff --git a/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift b/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift index 1e28aab08..8f3e6023d 100644 --- a/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift +++ b/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift @@ -6,6 +6,7 @@ // Copyright © 2023 Corporation for Digital Scholarship. All rights reserved. // +import AVFAudio import UIKit import SwiftUI @@ -26,6 +27,16 @@ protocol PdfReaderCoordinatorDelegate: ReaderCoordinatorDelegate, ReaderSidebarC func showFontSizePicker(sender: UIView, picked: @escaping (CGFloat) -> Void) func showDeleteAlertForAnnotation(sender: UIView, delete: @escaping () -> Void) func showDocumentChangedAlert(completed: @escaping () -> Void) + func showAccessibility( + speechManager: SpeechManager, + document: Document, + userInterfaceStyle: UIUserInterfaceStyle, + sender: UIBarButtonItem, + animated: Bool, + isFormSheet: @escaping () -> Bool, + dismissAction: @escaping () -> Void, + voiceChangeAction: @escaping (AVSpeechSynthesisVoice) -> Void + ) } protocol PdfAnnotationsCoordinatorDelegate: ReaderSidebarCoordinatorDelegate { @@ -83,10 +94,10 @@ final class PDFCoordinator: ReaderCoordinator { func start(animated: Bool) { let username = Defaults.shared.username - guard let dbStorage = self.controllers.userControllers?.dbStorage, - let userId = self.controllers.sessionController.sessionData?.userId, + guard let userControllers = controllers.userControllers, + let userId = controllers.sessionController.sessionData?.userId, !username.isEmpty, - let parentNavigationController = self.parentCoordinator?.navigationController + let parentNavigationController = parentCoordinator?.navigationController else { return } let settings = Defaults.shared.pdfSettings @@ -98,19 +109,19 @@ final class PDFCoordinator: ReaderCoordinator { DDLogWarn("PDFCoordinator: displayName is empty") } let handler = PDFReaderActionHandler( - dbStorage: dbStorage, - annotationPreviewController: self.controllers.annotationPreviewController, - pdfThumbnailController: self.controllers.pdfThumbnailController, - htmlAttributedStringConverter: self.controllers.htmlAttributedStringConverter, - schemaController: self.controllers.schemaController, - fileStorage: self.controllers.fileStorage, - idleTimerController: self.controllers.idleTimerController, - dateParser: self.controllers.dateParser + dbStorage: userControllers.dbStorage, + annotationPreviewController: controllers.annotationPreviewController, + pdfThumbnailController: controllers.pdfThumbnailController, + htmlAttributedStringConverter: controllers.htmlAttributedStringConverter, + schemaController: controllers.schemaController, + fileStorage: controllers.fileStorage, + idleTimerController: controllers.idleTimerController, + dateParser: controllers.dateParser ) let state = PDFReaderState( - url: self.url, - key: self.key, - parentKey: self.parentKey, + url: url, + key: key, + parentKey: parentKey, title: try? controllers.userControllers?.dbStorage.perform(request: ReadFilenameDbRequest(libraryId: libraryId, key: key), on: .main), libraryId: libraryId, initialPage: page, @@ -123,12 +134,13 @@ final class PDFCoordinator: ReaderCoordinator { ) let controller = PDFReaderViewController( viewModel: ViewModel(initialState: state, handler: handler), + pdfWorkerController: userControllers.pdfWorkerController, compactSize: UIDevice.current.isCompactWidth(size: parentNavigationController.view.frame.size) ) controller.coordinatorDelegate = self handler.delegate = controller - self.navigationController?.setViewControllers([controller], animated: false) + navigationController?.setViewControllers([controller], animated: false) } } @@ -268,6 +280,68 @@ extension PDFCoordinator: PdfReaderCoordinatorDelegate { controller.addAction(UIAlertAction(title: L10n.ok, style: .cancel, handler: { _ in completed() })) navigationController?.present(controller, animated: true) } + + func showAccessibility( + speechManager: SpeechManager, + document: Document, + userInterfaceStyle: UIUserInterfaceStyle, + sender: UIBarButtonItem, + animated: Bool, + isFormSheet: @escaping () -> Bool, + dismissAction: @escaping () -> Void, + voiceChangeAction: @escaping (AVSpeechSynthesisVoice) -> Void + ) { + guard let navigationController else { return } + let readerAction = { [weak self] in + guard let self else { return } + self.navigationController?.dismiss(animated: true) + showReader(document: document, userInterfaceStyle: userInterfaceStyle) + } + let controller = AccessibilityPopupViewController( + speechManager: speechManager, + isFormSheet: isFormSheet, + readerAction: readerAction, + dismissAction: dismissAction, + voiceChangeAction: voiceChangeAction + ) + controller.overrideUserInterfaceStyle = userInterfaceStyle + controller.coordinatorDelegate = self + if UIDevice.current.userInterfaceIdiom == .pad { + controller.modalPresentationStyle = .popover + controller.popoverPresentationController?.delegate = controller + if #available(iOS 17, *) { + controller.popoverPresentationController?.sourceItem = sender + } else { + controller.popoverPresentationController?.barButtonItem = sender + } + } else { + controller.modalPresentationStyle = .formSheet + } + navigationController.present(controller, animated: animated) + } +} + +extension PDFCoordinator: AccessibilityPopoupCoordinatorDelegate { + func showVoicePicker(for voice: AVSpeechSynthesisVoice, userInterfaceStyle: UIUserInterfaceStyle, selectionChanged: @escaping (AVSpeechSynthesisVoice) -> Void) { + guard let navigationController else { return } + let view = SpeechVoicePickerView(selectedVoice: voice, dismiss: { voice in + selectionChanged(voice) + if let presentedViewController = navigationController.presentedViewController as? AccessibilityPopupViewController { + presentedViewController.dismiss(animated: true) + } else { + navigationController.dismiss(animated: true) + } + }) + let controller = UIHostingController(rootView: view) + controller.overrideUserInterfaceStyle = userInterfaceStyle + controller.modalPresentationStyle = .formSheet + controller.isModalInPresentation = true + if let presentedController = navigationController.presentedViewController { + presentedController.present(controller, animated: true) + } else { + navigationController.present(controller, animated: true) + } + } } extension PDFCoordinator: PdfAnnotationsCoordinatorDelegate { diff --git a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarHandler.swift b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarHandler.swift index db943f14a..36ff81faa 100644 --- a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarHandler.swift +++ b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarHandler.swift @@ -26,6 +26,7 @@ protocol AnnotationToolbarHandlerDelegate: AnyObject { func setNavigationBar(hidden: Bool, animated: Bool) func setNavigationBar(alpha: CGFloat) func setDocumentInterface(hidden: Bool) + func annotationToolbarWillChange(state: AnnotationToolbarHandler.State, statusBarVisible: Bool) func topDidChange(forToolbarState state: AnnotationToolbarHandler.State) func updateStatusBar() } @@ -258,6 +259,10 @@ final class AnnotationToolbarHandler: NSObject { // MARK: - Actions + func setLeadingView(view: AnnotationToolbarLeadingView?) { + controller.setLeadingView(view: view) + } + func set(hidden: Bool, animated: Bool) { delegate.toolbarState = State(position: delegate.toolbarState.position, visible: !hidden) @@ -271,6 +276,7 @@ final class AnnotationToolbarHandler: NSObject { private func showAnnotationToolbar(state: State, statusBarVisible: Bool, animated: Bool) { controller.prepareForSizeChange() setConstraints(for: state.position, statusBarVisible: statusBarVisible) + delegate.annotationToolbarWillChange(state: state, statusBarVisible: statusBarVisible) controller.view.isHidden = false delegate.layoutIfNeeded() controller.sizeDidChange() @@ -306,6 +312,7 @@ final class AnnotationToolbarHandler: NSObject { } private func hideAnnotationToolbar(newState: State, statusBarVisible: Bool, animated: Bool) { + delegate.annotationToolbarWillChange(state: newState, statusBarVisible: statusBarVisible) delegate.topDidChange(forToolbarState: newState) if !animated { @@ -549,7 +556,9 @@ final class AnnotationToolbarHandler: NSObject { // Move from side to side or vertically let velocity = velocity(from: velocityPoint, newPosition: newPosition) setConstraints(for: newPosition, statusBarVisible: statusBarVisible) - delegate.topDidChange(forToolbarState: State(position: newPosition, visible: true)) + let newState = State(position: newPosition, visible: true) + delegate.annotationToolbarWillChange(state: newState, statusBarVisible: statusBarVisible) + delegate.topDidChange(forToolbarState: newState) delegate.setNeedsLayout() delegate.hideSidebarIfNeeded(forPosition: newPosition, isToolbarSmallerThanMinWidth: controller.view.frame.width < Self.minToolbarWidth, animated: true) @@ -590,11 +599,13 @@ final class AnnotationToolbarHandler: NSObject { } controller.prepareForSizeChange() + let newState = State(position: newPosition, visible: true) setConstraints(for: newPosition, statusBarVisible: statusBarVisible) + delegate.annotationToolbarWillChange(state: newState, statusBarVisible: statusBarVisible) delegate.layoutIfNeeded() controller.sizeDidChange() delegate.layoutIfNeeded() - delegate.topDidChange(forToolbarState: State(position: newPosition, visible: true)) + delegate.topDidChange(forToolbarState: newState) delegate.hideSidebarIfNeeded(forPosition: newPosition, isToolbarSmallerThanMinWidth: controller.view.frame.width < Self.minToolbarWidth, animated: true) diff --git a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift index 234876828..9d35ce53f 100644 --- a/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/AnnotationToolbarViewController.swift @@ -20,6 +20,10 @@ struct AnnotationToolOptions: OptionSet { static let stylus = AnnotationToolOptions(rawValue: 1 << 0) } +protocol AnnotationToolbarLeadingView: UIView { + func update(toRotation rotation: AnnotationToolbarViewController.Rotation) +} + protocol AnnotationToolbarDelegate: AnyObject { var activeAnnotationTool: AnnotationTool? { get } var canUndo: Bool { get } @@ -63,27 +67,30 @@ class AnnotationToolbarViewController: UIViewController { private let undoRedoEnabled: Bool private var horizontalHeight: NSLayoutConstraint! - private weak var stackView: UIStackView! - private weak var additionalStackView: UIStackView! + private weak var leadingView: AnnotationToolbarLeadingView? + private weak var toolContainer: UIStackView! + private var containerTop: NSLayoutConstraint! + private var containerLeading: NSLayoutConstraint! + private weak var containerToLeadingView: NSLayoutConstraint? + private var containerBottom: NSLayoutConstraint! + private var containerTrailing: NSLayoutConstraint! + private var containerToPickerVertical: NSLayoutConstraint! + private var containerToPickerHorizontal: NSLayoutConstraint! + private var containerCenteredHorizontal: NSLayoutConstraint! + private weak var trailingContainer: UIStackView! + private var trailingContainerTop: NSLayoutConstraint! + private var trailingContainerLeading: NSLayoutConstraint! + private weak var trailingContainerTrailing: NSLayoutConstraint! + private weak var trailingContainerBottom: NSLayoutConstraint! private(set) weak var colorPickerButton: UIButton! private var colorPickerTop: NSLayoutConstraint! private var colorPickerLeading: NSLayoutConstraint! private var colorPickerToAdditionalHorizontal: NSLayoutConstraint! private var colorPickerTrailing: NSLayoutConstraint! - private var colorPickerToAdditionalVertical: NSLayoutConstraint! + private var colorPickerToTrailingContainerVertical: NSLayoutConstraint! private var colorPickerBottom: NSLayoutConstraint! private(set) weak var undoButton: UIButton? private(set) weak var redoButton: UIButton? - private var additionalTop: NSLayoutConstraint! - private var additionalLeading: NSLayoutConstraint! - private weak var additionalTrailing: NSLayoutConstraint! - private weak var additionalBottom: NSLayoutConstraint! - private weak var containerTop: NSLayoutConstraint! - private weak var containerLeading: NSLayoutConstraint! - private var containerBottom: NSLayoutConstraint! - private var containerTrailing: NSLayoutConstraint! - private var containerToPickerVertical: NSLayoutConstraint! - private var containerToPickerHorizontal: NSLayoutConstraint! private var hairlineView: UIView! private var toolButtons: [ToolButton] weak var delegate: AnnotationToolbarDelegate? @@ -150,13 +157,14 @@ class AnnotationToolbarViewController: UIViewController { horizontalHeight.priority = .required containerBottom = view.bottomAnchor.constraint(equalTo: stackView.bottomAnchor, constant: 8) containerTrailing = view.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: 8) - additionalTop = additionalStackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 8) - additionalLeading = additionalStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8) + containerCenteredHorizontal = view.centerXAnchor.constraint(equalTo: stackView.centerXAnchor) + trailingContainerTop = additionalStackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 8) + trailingContainerLeading = additionalStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8) containerToPickerVertical = picker.topAnchor.constraint(greaterThanOrEqualTo: stackView.bottomAnchor, constant: 0) containerToPickerVertical.priority = .required containerToPickerHorizontal = picker.leadingAnchor.constraint(equalTo: stackView.trailingAnchor) containerToPickerHorizontal.priority = .required - colorPickerToAdditionalVertical = additionalStackView.topAnchor.constraint(equalTo: picker.bottomAnchor) + colorPickerToTrailingContainerVertical = additionalStackView.topAnchor.constraint(equalTo: picker.bottomAnchor) colorPickerToAdditionalHorizontal = additionalStackView.leadingAnchor.constraint(greaterThanOrEqualTo: picker.trailingAnchor, constant: 0) colorPickerTop = picker.topAnchor.constraint(equalTo: view.topAnchor) colorPickerBottom = view.bottomAnchor.constraint(equalTo: picker.bottomAnchor) @@ -179,9 +187,9 @@ class AnnotationToolbarViewController: UIViewController { colorPickerLeading, colorPickerTrailing, additionalBottom, - colorPickerToAdditionalVertical, + colorPickerToTrailingContainerVertical, additionalTrailing, - additionalLeading, + trailingContainerLeading, hairlineHeight, hairlineLeading, hairlineTrailing, @@ -190,10 +198,10 @@ class AnnotationToolbarViewController: UIViewController { self.containerTop = containerTop self.containerLeading = containerLeading - self.additionalTrailing = additionalTrailing - self.additionalBottom = additionalBottom - self.stackView = stackView - self.additionalStackView = additionalStackView + self.trailingContainerTrailing = additionalTrailing + self.trailingContainerBottom = additionalBottom + self.toolContainer = stackView + self.trailingContainer = additionalStackView func createToolButtons(from tools: [ToolButton]) -> [UIView] { var showMoreConfig = UIButton.Configuration.plain() @@ -276,8 +284,8 @@ class AnnotationToolbarViewController: UIViewController { // MARK: - Layout func prepareForSizeChange() { - for (idx, view) in stackView.arrangedSubviews.enumerated() { - if idx == stackView.arrangedSubviews.count - 1 { + for (idx, view) in toolContainer.arrangedSubviews.enumerated() { + if idx == toolContainer.arrangedSubviews.count - 1 { view.alpha = 1 view.isHidden = false } else { @@ -288,11 +296,11 @@ class AnnotationToolbarViewController: UIViewController { } func sizeDidChange() { - guard stackView.arrangedSubviews.count == toolButtons.count + 1 else { - DDLogError("AnnotationToolbarViewController: too many views in stack view! Stack view views: \(stackView.arrangedSubviews.count). Tools: \(toolButtons.count)") + guard toolContainer.arrangedSubviews.count == toolButtons.count + 1 else { + DDLogError("AnnotationToolbarViewController: too many views in stack view! Stack view views: \(toolContainer.arrangedSubviews.count). Tools: \(toolButtons.count)") return } - guard let button = stackView.arrangedSubviews.last, let maxAvailableSize = delegate?.maxAvailableToolbarSize, maxAvailableSize > 0 else { return } + guard let button = toolContainer.arrangedSubviews.last, let maxAvailableSize = delegate?.maxAvailableToolbarSize, maxAvailableSize > 0 else { return } let isHorizontal = view.frame.width > view.frame.height let buttonSize = isHorizontal ? button.frame.width : button.frame.height @@ -300,22 +308,22 @@ class AnnotationToolbarViewController: UIViewController { guard buttonSize > 0 else { return } let stackViewOffset = isHorizontal ? containerLeading.constant : containerTop.constant - let additionalSize = isHorizontal ? additionalStackView.frame.width : additionalStackView.frame.height + let additionalSize = isHorizontal ? trailingContainer.frame.width : trailingContainer.frame.height let containerToPickerOffset = isHorizontal ? containerToPickerHorizontal.constant : containerToPickerVertical.constant let pickerSize = isHorizontal ? colorPickerButton.frame.width : colorPickerButton.frame.height - let pickerToAdditionalOffset = isHorizontal ? colorPickerToAdditionalHorizontal.constant : colorPickerToAdditionalVertical.constant - let additionalOffset = isHorizontal ? additionalTrailing.constant : additionalBottom.constant + let pickerToAdditionalOffset = isHorizontal ? colorPickerToAdditionalHorizontal.constant : colorPickerToTrailingContainerVertical.constant + let additionalOffset = isHorizontal ? trailingContainerTrailing.constant : trailingContainerBottom.constant let remainingSize = maxAvailableSize - stackViewOffset - containerToPickerOffset - pickerSize - pickerToAdditionalOffset - additionalSize - additionalOffset if remainingSize < 0 { DDLogWarn("AnnotationToolbarViewController: not enough \(isHorizontal ? "horizontal" : "vertical") minimum size") } - let buttonSpacing = stackView.spacing + let buttonSpacing = toolContainer.spacing let count = max(0, min(Int(floor((remainingSize + buttonSpacing) / (buttonSize + buttonSpacing))), toolButtons.count)) for idx in 0.. + private unowned let pdfWorkerController: PDFWorkerController let disposeBag: DisposeBag var state: PDFReaderState { return viewModel.state } @@ -38,6 +39,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { weak var sidebarControllerLeft: NSLayoutConstraint? weak var documentController: PDFDocumentViewController? weak var documentControllerLeft: NSLayoutConstraint? + weak var documentControllerBottom: NSLayoutConstraint? weak var annotationToolbarController: AnnotationToolbarViewController? private var documentTop: NSLayoutConstraint! var annotationToolbarHandler: AnnotationToolbarHandler? @@ -59,6 +61,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { } } private var previousTraitCollection: UITraitCollection? + private var accessibilityHandler: AccessibilityViewHandler! var isSidebarVisible: Bool { return sidebarControllerLeft?.constant == 0 } var isToolbarVisible: Bool { return toolbarState.visible } var isDocumentLocked: Bool { return viewModel.state.document.isLocked } @@ -182,8 +185,9 @@ class PDFReaderViewController: UIViewController, ReaderViewController { return false } - init(viewModel: ViewModel, compactSize: Bool) { + init(viewModel: ViewModel, pdfWorkerController: PDFWorkerController, compactSize: Bool) { self.viewModel = viewModel + self.pdfWorkerController = pdfWorkerController isCompactWidth = compactSize disposeBag = DisposeBag() super.init(nibName: nil, bundle: nil) @@ -203,6 +207,15 @@ class PDFReaderViewController: UIViewController, ReaderViewController { viewModel.process(action: .changeIdleTimerDisabled(true)) view.backgroundColor = .systemGray6 setupViews() + accessibilityHandler = AccessibilityViewHandler( + key: viewModel.state.key, + libraryId: viewModel.state.library.identifier, + viewController: self, + documentContainer: documentController!.view, + delegate: self, + dbStorage: viewModel.handler.dbStorage + ) + accessibilityHandler.delegate = self setupObserving() if !viewModel.state.document.isLocked, let documentController { @@ -260,6 +273,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { view.addSubview(forwardButton) let documentLeftConstraint = documentController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor) + let documentBottomConstraint = view.bottomAnchor.constraint(equalTo: documentController.view.bottomAnchor) let sidebarLeftConstraint = sidebarController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: -PDFReaderLayout.sidebarWidth) documentTop = documentController.view.topAnchor.constraint(equalTo: view.topAnchor) @@ -278,7 +292,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { separator.bottomAnchor.constraint(equalTo: view.bottomAnchor), documentController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), documentTop, - documentController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), + documentBottomConstraint, documentLeftConstraint, backButton.leadingAnchor.constraint(equalTo: documentController.view.leadingAnchor, constant: 20), documentController.view.bottomAnchor.constraint(equalTo: backButton.bottomAnchor, constant: 40), @@ -289,6 +303,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { self.documentController = documentController documentControllerLeft = documentLeftConstraint + documentControllerBottom = documentBottomConstraint self.sidebarController = sidebarController sidebarControllerLeft = sidebarLeftConstraint annotationToolbarController = annotationToolbar @@ -316,18 +331,9 @@ class PDFReaderViewController: UIViewController, ReaderViewController { closeButton.accessibilityLabel = L10n.close closeButton.rx.tap.subscribe(onNext: { [weak self] _ in self?.close() }).disposed(by: disposeBag) - let readerButton = UIBarButtonItem(image: Asset.Images.pdfRawReader.image, style: .plain, target: nil, action: nil) - readerButton.isEnabled = !viewModel.state.document.isLocked - readerButton.accessibilityLabel = L10n.Accessibility.Pdf.openReader - readerButton.title = L10n.Accessibility.Pdf.openReader - readerButton.rx.tap - .subscribe(onNext: { [weak self] _ in - guard let self else { return } - coordinatorDelegate?.showReader(document: viewModel.state.document, userInterfaceStyle: viewModel.state.settings.appearanceMode.userInterfaceStyle) - }) - .disposed(by: disposeBag) - - navigationItem.leftBarButtonItems = [closeButton, sidebarButton, readerButton] + let accessibilityButton = accessibilityHandler.createAccessibilityButton(isSelected: false, isFilled: false, isEnabled: !viewModel.state.document.isLocked) + + navigationItem.leftBarButtonItems = [closeButton, sidebarButton, accessibilityButton] navigationItem.rightBarButtonItems = createRightBarButtonItems() } @@ -394,6 +400,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) updateUserInterfaceStyleIfNeeded(previousTraitCollection: previousTraitCollection) + accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: isNavigationBarHidden) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -735,6 +742,14 @@ extension PDFReaderViewController: AnnotationToolbarHandlerDelegate { func setNavigationBar(alpha: CGFloat) { navigationController?.navigationBar.alpha = alpha } + + func annotationToolbarWillChange(state: AnnotationToolbarHandler.State, statusBarVisible: Bool) { + if state.visible && state.position == .pinned { + accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: true) + } else { + accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: !statusBarVisible) + } + } func topDidChange(forToolbarState state: AnnotationToolbarHandler.State) { guard let annotationToolbarHandler, let annotationToolbarController else { return } @@ -892,6 +907,9 @@ extension PDFReaderViewController: PDFDocumentDelegate { statusBarVisible = !isHidden intraDocumentNavigationHandler?.interfaceIsVisible = !isHidden annotationToolbarHandler?.interfaceVisibilityDidChange() + if shouldChangeNavigationBarVisibility { + accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: isHidden) + } UIView.animate(withDuration: 0.15, animations: { [weak self] in guard let self else { return } @@ -982,3 +1000,108 @@ extension PDFReaderViewController: IntraDocumentNavigationButtonsHandlerDelegate } extension PDFReaderViewController: ParentWithSidebarController {} + +extension PDFReaderViewController: SpeechmanagerDelegate { + func getCurrentPageIndex() -> UInt { + return documentController?.currentPage ?? 0 + } + + func getNextPageIndex(from currentPageIndex: UInt) -> UInt? { + guard currentPageIndex + 1 < viewModel.state.document.pageCount else { return nil } + return currentPageIndex + 1 + } + + func getPreviousPageIndex(from currentPageIndex: UInt) -> UInt? { + guard currentPageIndex > 0 else { return nil } + return currentPageIndex - 1 + } + + func text(for indices: [UInt], completion: @escaping ([UInt: String]?) -> Void) { +// var result: [UInt: String] = [:] +// for index in indices { +// guard let parser = viewModel.state.document.textParserForPage(at: index) else { +// completion(nil) +// return +// } +// result[index] = parser.text +// } +// completion(result) + DDLogInfo("PDFReaderViewController: text for \(indices)") + guard let file = viewModel.state.document.fileURL.flatMap({ Files.file(from: $0) }) else { + DDLogInfo("PDFReaderViewController: document url not found") + completion(nil) + return + } + let start = CFAbsoluteTimeGetCurrent() + pdfWorkerController.queue(work: .init(file: file as! FileData, kind: .fullText(pages: indices.map({ Int($0) })))) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { update in + switch update.kind { + case .failed, .cancelled: + DDLogError("PDFReaderViewController: full data extraction failed") + completion(nil) + + case .inProgress: + break + + case .extractedData(let data): + guard let text = data["text"] as? String else { + DDLogError("PDFReaderViewController: full text extraction incorrect data - \(data)") + completion(nil) + return + } + let textParts = text.components(separatedBy: "\u{000C}") + guard textParts.count == indices.count else { + DDLogError("PDFReaderViewController: full text didn't contain proper number of pages (\(indices.count); \(textParts.count))") + completion(nil) + return + } + var result: [UInt: String] = [:] + for idx in 0..( + speechManager: SpeechManager, + sender: UIBarButtonItem, + animated: Bool, + isFormSheet: @escaping () -> Bool, + dismissAction: @escaping () -> Void, + voiceChangeAction: @escaping (AVSpeechSynthesisVoice) -> Void + ) { + coordinatorDelegate?.showAccessibility( + speechManager: speechManager, + document: viewModel.state.document, + userInterfaceStyle: viewModel.state.settings.appearanceMode.userInterfaceStyle, + sender: sender, + animated: animated, + isFormSheet: isFormSheet, + dismissAction: dismissAction, + voiceChangeAction: voiceChangeAction + ) + } + + func addAccessibilityControlsViewToAnnotationToolbar(view: AnnotationToolbarLeadingView) { + annotationToolbarHandler?.setLeadingView(view: view) + } + + func removeAccessibilityControlsViewFromAnnotationToolbar() { + annotationToolbarHandler?.setLeadingView(view: nil) + } +} diff --git a/Zotero/Scenes/General/Views/AccessibilityPopupViewController.swift b/Zotero/Scenes/General/Views/AccessibilityPopupViewController.swift new file mode 100644 index 000000000..d6cbae562 --- /dev/null +++ b/Zotero/Scenes/General/Views/AccessibilityPopupViewController.swift @@ -0,0 +1,405 @@ +// +// AccessibilityPopupViewController.swift +// Zotero +// +// Created by Michal Rentka on 30.05.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import UIKit + +import AVFAudio +import RxCocoa +import RxSwift + +import CocoaLumberjackSwift + +protocol AccessibilityPopoupCoordinatorDelegate: AnyObject { + func showVoicePicker(for voice: AVSpeechSynthesisVoice, userInterfaceStyle: UIUserInterfaceStyle, selectionChanged: @escaping (AVSpeechSynthesisVoice) -> Void) +} + +final class AccessibilityPopupViewController: UIViewController, UIPopoverPresentationControllerDelegate { + private unowned let speechManager: SpeechManager + private let speedNumberFormatter: NumberFormatter + private let disposeBag: DisposeBag + private let readerAction: () -> Void + private let dismissAction: () -> Void + private let isFormSheet: () -> Bool + private let voiceChangeAction: (AVSpeechSynthesisVoice) -> Void + private var containerTop: NSLayoutConstraint! + private var containerHeight: NSLayoutConstraint! + private weak var speechButton: UIButton! + private weak var speechContainer: UIView! + private weak var voiceButton: UIButton! + private weak var speedButton: UIButton! + private weak var controlsView: AccessibilitySpeechControlsStackView! + private var speechButtonBottom: NSLayoutConstraint! + private var speechContainerBottom: NSLayoutConstraint! + private var currentHeight: CGFloat { + return speechManager.state.value.isStopped ? baseHeight(isPopover: !isFormSheet()) : expandedHeight(isPopover: !isFormSheet()) + } + + weak var coordinatorDelegate: AccessibilityPopoupCoordinatorDelegate? + + init( + speechManager: SpeechManager, + isFormSheet: @escaping () -> Bool, + readerAction: @escaping () -> Void, + dismissAction: @escaping () -> Void, + voiceChangeAction: @escaping (AVSpeechSynthesisVoice) -> Void + ) { + self.speechManager = speechManager + self.isFormSheet = isFormSheet + self.readerAction = readerAction + self.dismissAction = dismissAction + self.voiceChangeAction = voiceChangeAction + speedNumberFormatter = NumberFormatter() + disposeBag = DisposeBag() + super.init(nibName: nil, bundle: nil) + speedNumberFormatter.numberStyle = .decimal + speedNumberFormatter.minimumFractionDigits = 0 + speedNumberFormatter.maximumFractionDigits = 2 + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .clear + createView() + updatePopup(toHeight: currentHeight) + observeState() + + func createView() { + // Speech container + let speechContainer = UIView() + speechContainer.translatesAutoresizingMaskIntoConstraints = false + speechContainer.backgroundColor = Asset.Colors.navbarBackground.color + speechContainer.layer.cornerRadius = 13 + speechContainer.layer.masksToBounds = true + speechContainer.isHidden = speechManager.state.value.isStopped + + let titleLabel = UILabel() + titleLabel.text = L10n.Accessibility.Speech.title + titleLabel.font = .preferredFont(forTextStyle: .headline) + + let spacer = UIView() + spacer.setContentHuggingPriority(.defaultLow, for: .horizontal) + spacer.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + + var xConfiguration = UIButton.Configuration.filled() + xConfiguration.image = UIImage(systemName: "xmark", withConfiguration: UIImage.SymbolConfiguration.init(pointSize: titleLabel.font.pointSize, weight: .medium, scale: .medium)) + xConfiguration.baseBackgroundColor = .systemGray5 + xConfiguration.baseForegroundColor = .darkGray + xConfiguration.cornerStyle = .capsule + // speedConfiguration.contentInsets = .init(top: 6, leading: 16, bottom: 6, trailing: 16) + let xButton = UIButton(configuration: xConfiguration) + xButton.setContentHuggingPriority(.required, for: .vertical) + xButton.setContentHuggingPriority(.required, for: .horizontal) + xButton.setContentCompressionResistancePriority(.required, for: .horizontal) + xButton.addAction(UIAction(handler: { [weak self] _ in self?.speechManager.stop() }), for: .touchUpInside) + + let titleStackView = UIStackView(arrangedSubviews: [titleLabel, spacer, xButton]) + titleStackView.axis = .horizontal + titleStackView.alignment = .fill + titleStackView.distribution = .fill + titleStackView.setContentHuggingPriority(.required, for: .vertical) + titleStackView.translatesAutoresizingMaskIntoConstraints = false + speechContainer.addSubview(titleStackView) + + let controlsView = AccessibilitySpeechControlsStackView(speechManager: speechManager) + controlsView.setContentHuggingPriority(.defaultLow, for: .vertical) + speechContainer.addSubview(controlsView) + + let currentVoice = speechManager.currentVoice + var voiceConfiguration = UIButton.Configuration.filled() + voiceConfiguration.title = currentVoice.flatMap({ self.voiceTitle(from: $0) }) ?? "Voice" + voiceConfiguration.titleLineBreakMode = .byTruncatingMiddle + voiceConfiguration.baseBackgroundColor = .systemGray5 + voiceConfiguration.baseForegroundColor = .label + voiceConfiguration.cornerStyle = .capsule + voiceConfiguration.contentInsets = .init(top: 6, leading: 10, bottom: 6, trailing: 10) + let voiceButton = UIButton(configuration: voiceConfiguration) + voiceButton.isEnabled = currentVoice != nil + voiceButton.setContentHuggingPriority(.required, for: .vertical) + voiceButton.setContentHuggingPriority(.required, for: .horizontal) + voiceButton.addAction(UIAction(handler: { [weak self] _ in self?.showVoiceOptions() }), for: .touchUpInside) + + let spacer2 = UIView() + spacer2.setContentHuggingPriority(.defaultLow, for: .horizontal) + spacer2.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + spacer2.widthAnchor.constraint(greaterThanOrEqualToConstant: 20).isActive = true + + let speedActions = [2, 1.75, 1.5, 1.25, 1, 0.75].map({ [unowned self] val in UIAction(title: formatted(modifier: val), handler: { [weak self] _ in self?.set(rateModifier: val) }) }) + var speedConfiguration = UIButton.Configuration.filled() + speedConfiguration.title = formatted(modifier: Defaults.shared.speechRateModifier) + speedConfiguration.baseBackgroundColor = .systemGray5 + speedConfiguration.baseForegroundColor = .label + speedConfiguration.cornerStyle = .capsule + speedConfiguration.contentInsets = .init(top: 6, leading: 10, bottom: 6, trailing: 10) + let speedButton = UIButton(configuration: speedConfiguration) + speedButton.isEnabled = voiceButton.isEnabled + speedButton.setContentHuggingPriority(.required, for: .vertical) + speedButton.setContentHuggingPriority(.required, for: .horizontal) + speedButton.setContentCompressionResistancePriority(.required, for: .horizontal) + speedButton.setContentCompressionResistancePriority(.required, for: .vertical) + speedButton.showsMenuAsPrimaryAction = true + speedButton.menu = UIMenu(title: "Speech Rate", children: speedActions) + + let additionalControlsStackView = UIStackView(arrangedSubviews: [voiceButton, spacer2, speedButton]) + additionalControlsStackView.axis = .horizontal + additionalControlsStackView.alignment = .fill + additionalControlsStackView.distribution = .fill + additionalControlsStackView.setContentHuggingPriority(.required, for: .vertical) + additionalControlsStackView.translatesAutoresizingMaskIntoConstraints = false + speechContainer.addSubview(additionalControlsStackView) + + self.controlsView = controlsView + self.voiceButton = voiceButton + self.speedButton = speedButton + self.speechContainer = speechContainer + + // Reader button + var mainButtonsAttributeContainer = AttributeContainer() + mainButtonsAttributeContainer.font = .preferredFont(for: .body, weight: .medium) + + var readerConfiguration = UIButton.Configuration.filled() + readerConfiguration.cornerStyle = .capsule + readerConfiguration.imagePadding = 12 + readerConfiguration.image = UIImage(systemName: "text.page.fill", withConfiguration: UIImage.SymbolConfiguration(scale: .small)) + readerConfiguration.attributedTitle = AttributedString(L10n.Accessibility.showReader, attributes: mainButtonsAttributeContainer) + readerConfiguration.contentInsets = NSDirectionalEdgeInsets(top: 14, leading: 0, bottom: 14, trailing: 0) + readerConfiguration.baseBackgroundColor = Asset.Colors.zoteroBlueWithDarkMode.color + readerConfiguration.baseForegroundColor = .white + let readerButton = UIButton(configuration: readerConfiguration) + readerButton.translatesAutoresizingMaskIntoConstraints = false + readerButton.accessibilityLabel = L10n.Accessibility.showReaderAccessibilityLabel + readerButton.setContentCompressionResistancePriority(.required, for: .vertical) + readerButton.addAction(UIAction(handler: { [weak self] _ in self?.readerAction() }), for: .touchUpInside) + + // Speech button + + var speechConfiguration = UIButton.Configuration.filled() + speechConfiguration.cornerStyle = .capsule + speechConfiguration.imagePadding = 12 + speechConfiguration.image = UIImage(systemName: "headphones", withConfiguration: UIImage.SymbolConfiguration(scale: .small)) + speechConfiguration.attributedTitle = AttributedString(L10n.Accessibility.showSpeech, attributes: mainButtonsAttributeContainer) + speechConfiguration.contentInsets = NSDirectionalEdgeInsets(top: 14, leading: 0, bottom: 14, trailing: 0) + speechConfiguration.baseBackgroundColor = .systemGray5 + speechConfiguration.baseForegroundColor = .label + let speechButton = UIButton(configuration: speechConfiguration) + speechButton.isHidden = !speechManager.state.value.isStopped + speechButton.translatesAutoresizingMaskIntoConstraints = false + speechButton.accessibilityLabel = L10n.Accessibility.showSpeechAccessibilityLabel + speechButton.addAction(UIAction(handler: { [weak self] _ in self?.speechManager.start() }), for: .touchUpInside) + self.speechButton = speechButton + + speechButtonBottom = view.safeAreaLayoutGuide.bottomAnchor.constraint(greaterThanOrEqualTo: speechButton.bottomAnchor, constant: 16) + speechContainerBottom = view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: speechContainer.bottomAnchor, constant: 16) + + // Container + // We use additional container for the whole UI so that we can we can mimic the .pageSheet presentation in .formSheet, + // because the .popover always adopts to .formSheet when window size changes and we can't force .pageSheet. + let container = UIView() + container.backgroundColor = .systemGroupedBackground + container.translatesAutoresizingMaskIntoConstraints = false + container.addSubview(speechButton) + container.addSubview(readerButton) + container.addSubview(speechContainer) + containerHeight = container.heightAnchor.constraint(equalToConstant: currentHeight) + containerTop = container.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor) + view.addSubview(container) + + // Button which is used to dismiss on tap on the "fake background" area when in .pageSheet mode. + let dismissButton = UIButton() + dismissButton.translatesAutoresizingMaskIntoConstraints = false + dismissButton.addAction(UIAction(handler: { [weak self] _ in self?.presentingViewController?.dismiss(animated: true) }), for: .touchUpInside) + view.addSubview(dismissButton) + + let bottomToActivate = speechManager.state.value.isStopped ? speechButtonBottom : speechContainerBottom + + var toActivate = [ + // Container + container.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + view.bottomAnchor.constraint(equalTo: container.bottomAnchor), + view.safeAreaLayoutGuide.trailingAnchor.constraint(equalTo: container.trailingAnchor), + dismissButton.topAnchor.constraint(equalTo: view.topAnchor), + dismissButton.bottomAnchor.constraint(equalTo: container.topAnchor), + dismissButton.leadingAnchor.constraint(equalTo: view.leadingAnchor), + dismissButton.trailingAnchor.constraint(equalTo: view.trailingAnchor), + // Reader Button + readerButton.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 16), + container.trailingAnchor.constraint(equalTo: readerButton.trailingAnchor, constant: 16), + readerButton.topAnchor.constraint(equalTo: container.topAnchor, constant: 16), + // Speech button + speechButton.topAnchor.constraint(equalTo: readerButton.bottomAnchor, constant: 16), + speechButton.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 16), + container.trailingAnchor.constraint(equalTo: speechButton.trailingAnchor, constant: 16), + speechButton.heightAnchor.constraint(equalTo: readerButton.heightAnchor), + // Speech container + speechContainer.topAnchor.constraint(equalTo: readerButton.bottomAnchor, constant: 16), + speechContainer.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 16), + container.trailingAnchor.constraint(equalTo: speechContainer.trailingAnchor, constant: 16), + bottomToActivate!, + // Speech Title + titleStackView.topAnchor.constraint(equalTo: speechContainer.topAnchor, constant: 16), + titleStackView.leadingAnchor.constraint(equalTo: speechContainer.leadingAnchor, constant: 16), + speechContainer.trailingAnchor.constraint(equalTo: titleStackView.trailingAnchor, constant: 16), + // Speech Controls + controlsView.leadingAnchor.constraint(equalTo: speechContainer.leadingAnchor, constant: 16), + speechContainer.trailingAnchor.constraint(equalTo: controlsView.trailingAnchor, constant: 16), + titleStackView.bottomAnchor.constraint(equalTo: controlsView.topAnchor), + // Speech Additional Controls + controlsView.bottomAnchor.constraint(equalTo: additionalControlsStackView.topAnchor), + additionalControlsStackView.leadingAnchor.constraint(equalTo: speechContainer.leadingAnchor, constant: 16), + speechContainer.trailingAnchor.constraint(equalTo: additionalControlsStackView.trailingAnchor, constant: 16), + speechContainer.bottomAnchor.constraint(equalTo: additionalControlsStackView.bottomAnchor, constant: 16) + ] + + if isFormSheet() { + toActivate.append(containerHeight) + } else { + toActivate.append(containerTop) + } + + NSLayoutConstraint.activate(toActivate) + } + + func observeState() { + speechManager.state + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] state in + guard let self else { return } + process(state: state) + }) + .disposed(by: disposeBag) + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + dismissAction() + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + updatePopup(toHeight: currentHeight) + } + + // MARK: - Actions + + private func voiceTitle(from voice: AVSpeechSynthesisVoice) -> String { + return Locale.current.localizedString(forIdentifier: voice.language) ?? voice.language// + " - " + voice.name + } + + private func showVoiceOptions() { + guard let voice = speechManager.currentVoice else { return } + if speechManager.isSpeaking { + speechManager.pause() + } + coordinatorDelegate?.showVoicePicker(for: voice, userInterfaceStyle: overrideUserInterfaceStyle, selectionChanged: { [weak self] voice in + self?.update(voice: voice) + self?.voiceChangeAction(voice) + }) + } + + private func formatted(modifier: Float) -> String { + return (speedNumberFormatter.string(from: NSNumber(value: modifier)) ?? "") + "x" + } + + private func set(rateModifier: Float) { + speechManager.set(rateModifier: rateModifier) + speedButton.configuration?.title = formatted(modifier: rateModifier) + Defaults.shared.speechRateModifier = rateModifier + } + + func baseHeight(isPopover: Bool) -> CGFloat { + return isPopover ? 130 : 176 + } + + func expandedHeight(isPopover: Bool) -> CGFloat { + return isPopover ? 262 : 300 + } + + // MARK: - SpeechManager State + + private func process(state: SpeechManager.State) { + guard let data = updateToState() else { return } + view.layoutIfNeeded() + data.toShow.alpha = 0 + data.toShow.isHidden = false + UIView.animate(withDuration: 0.2, animations: { + data.toShow.alpha = 1 + data.toHide.alpha = 0 + self.updatePopup(toHeight: data.height) + self.view.layoutIfNeeded() + }, completion: { _ in + data.toHide.isHidden = true + }) + + func updateToState() -> (toHide: UIView, toShow: UIView, height: CGFloat)? { + switch state { + case .loading: + if voiceButton.isEnabled { + voiceButton.isEnabled = false + speedButton.isEnabled = false + } + return loadingSpeakingContainerState() + + case .speaking: + if !voiceButton.isEnabled, let voice = speechManager.currentVoice { + // TODO: - change title when page changes + var config = voiceButton.configuration + config?.title = voiceTitle(from: voice) + voiceButton.configuration = config + voiceButton.isEnabled = true + speedButton.isEnabled = true + } + return loadingSpeakingContainerState() + + case .stopped: + guard speechButton.isHidden else { return nil } + speechContainerBottom.isActive = false + speechButtonBottom.isActive = true + return (speechContainer, speechButton, baseHeight(isPopover: !isFormSheet())) + + case .paused: + return nil + } + } + + func loadingSpeakingContainerState() -> (toHide: UIView, toShow: UIView, height: CGFloat)? { + guard speechContainer.isHidden else { return nil } + speechContainerBottom.isActive = true + speechButtonBottom.isActive = false + return (speechButton, speechContainer, expandedHeight(isPopover: !isFormSheet())) + } + } + + private func updatePopup(toHeight height: CGFloat) { + if isFormSheet() { + containerTop?.isActive = false + containerHeight?.isActive = true + containerHeight?.constant = height + } else { + containerHeight?.isActive = false + containerTop?.isActive = true + preferredContentSize = CGSize(width: 300, height: height) + } + } + + private func update(voice: AVSpeechSynthesisVoice) { + var config = voiceButton.configuration + config?.title = voiceTitle(from: voice) + voiceButton.configuration = config + } + + // MARK: - UIPopoverPresentationControllerDelegate + + func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { + return .formSheet + } +} diff --git a/Zotero/Scenes/General/Views/AccessibilitySpeechControlsStackView.swift b/Zotero/Scenes/General/Views/AccessibilitySpeechControlsStackView.swift new file mode 100644 index 000000000..d5446550a --- /dev/null +++ b/Zotero/Scenes/General/Views/AccessibilitySpeechControlsStackView.swift @@ -0,0 +1,121 @@ +// +// AccessibilitySpeechControlsStackView.swift +// Zotero +// +// Created by Michal Rentka on 02.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import UIKit + +import RxSwift + +final class AccessibilitySpeechControlsStackView: UIStackView { + private let disposeBag: DisposeBag = DisposeBag() + + weak var playButton: UIButton! + weak var pauseButton: UIButton! + weak var backwardButton: UIButton! + weak var forwardButton: UIButton! + weak var activityIndicator: UIActivityIndicatorView! + + convenience init(speechManager: SpeechManager) { + let imageConfiguration = UIImage.SymbolConfiguration.init(scale: .large) + + var playConfig = UIButton.Configuration.plain() + playConfig.image = UIImage(systemName: "play.fill", withConfiguration: imageConfiguration) + playConfig.contentInsets = NSDirectionalEdgeInsets(top: 8, leading: 22, bottom: 8, trailing: 22) + let playButton = UIButton(configuration: playConfig) + playButton.accessibilityLabel = L10n.Accessibility.Speech.play + playButton.isHidden = speechManager.isSpeaking + + var pauseConfig = UIButton.Configuration.plain() + pauseConfig.image = UIImage(systemName: "pause.fill", withConfiguration: imageConfiguration) + let pauseButton = UIButton(configuration: pauseConfig) + pauseButton.accessibilityLabel = L10n.Accessibility.Speech.pause + pauseButton.isHidden = !speechManager.isSpeaking + + var forwardConfig = UIButton.Configuration.plain() + forwardConfig.image = UIImage(systemName: "plus.arrow.trianglehead.clockwise", withConfiguration: imageConfiguration) + let forwardButton = UIButton(configuration: forwardConfig) + forwardButton.accessibilityLabel = L10n.Accessibility.Speech.forward + forwardButton.isEnabled = speechManager.isSpeaking + + var backwardConfig = UIButton.Configuration.plain() + backwardConfig.image = UIImage(systemName: "minus.arrow.trianglehead.counterclockwise", withConfiguration: imageConfiguration) + let backwardButton = UIButton(configuration: backwardConfig) + backwardButton.accessibilityLabel = L10n.Accessibility.Speech.backward + backwardButton.isEnabled = speechManager.isSpeaking + + let activityIndicator = UIActivityIndicatorView(style: .medium) + activityIndicator.hidesWhenStopped = true + + self.init(arrangedSubviews: [backwardButton, playButton, pauseButton, activityIndicator, forwardButton]) + + translatesAutoresizingMaskIntoConstraints = false + axis = .horizontal + alignment = .center + distribution = .fillEqually + playButton.addAction(UIAction(handler: { [weak speechManager] _ in playOrResume(speechManager: speechManager) }), for: .touchUpInside) + pauseButton.addAction(UIAction(handler: { [weak speechManager] _ in speechManager?.pause() }), for: .touchUpInside) + forwardButton.addAction(UIAction(handler: { [weak speechManager] _ in speechManager?.forward() }), for: .touchUpInside) + backwardButton.addAction(UIAction(handler: { [weak speechManager] _ in speechManager?.backward() }), for: .touchUpInside) + self.playButton = playButton + self.pauseButton = pauseButton + self.forwardButton = forwardButton + self.backwardButton = backwardButton + self.activityIndicator = activityIndicator + + speechManager.state + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] state in + self?.update(state: state) + }) + .disposed(by: disposeBag) + + func playOrResume(speechManager: SpeechManager?) { + guard let speechManager else { return } + if speechManager.isPaused { + speechManager.resume() + } else { + speechManager.start() + } + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init(coder: NSCoder) { + super.init(coder: coder) + } + + private func update(state: SpeechManager.State) { + switch state { + case .loading: + playButton.isHidden = true + pauseButton.isHidden = true + activityIndicator.startAnimating() + activityIndicator.isHidden = false + + case .speaking: + if activityIndicator.isAnimating { + activityIndicator.stopAnimating() + } + playButton.isHidden = true + pauseButton.isHidden = false + forwardButton.isEnabled = true + backwardButton.isEnabled = true + + case .stopped, .paused: + if activityIndicator.isAnimating { + activityIndicator.stopAnimating() + } + pauseButton.isHidden = true + playButton.isHidden = false + forwardButton.isEnabled = false + backwardButton.isEnabled = false + } + } +} diff --git a/Zotero/Scenes/General/Views/AccessibilitySpeechControlsView.swift b/Zotero/Scenes/General/Views/AccessibilitySpeechControlsView.swift new file mode 100644 index 000000000..50ce01d7b --- /dev/null +++ b/Zotero/Scenes/General/Views/AccessibilitySpeechControlsView.swift @@ -0,0 +1,88 @@ +// +// AccessibilitySpeechControlsView.swift +// Zotero +// +// Created by Michal Rentka on 01.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import UIKit + +final class AccessibilitySpeechControlsView: UIView, AnnotationToolbarLeadingView { + enum Kind { + case annotationToolbar, bottomToolbar, navbar + } + + let type: Kind + unowned let controlsView: AccessibilitySpeechControlsStackView + + private weak var widthConstraint: NSLayoutConstraint? + private weak var heightConstraint: NSLayoutConstraint? + + init(type: Kind, speechManager: SpeechManager) { + let controls = AccessibilitySpeechControlsStackView(speechManager: speechManager) + self.type = type + controlsView = controls + super.init(frame: .zero) + + translatesAutoresizingMaskIntoConstraints = false + layer.masksToBounds = false + + addSubview(controls) + + let height = controls.heightAnchor.constraint(equalToConstant: 44) + + NSLayoutConstraint.activate([ + height, + controls.topAnchor.constraint(equalTo: topAnchor), + controls.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingAnchor.constraint(equalTo: controls.trailingAnchor) + ]) + + heightConstraint = height + + switch type { + case .annotationToolbar: + let width = widthAnchor.constraint(equalToConstant: 150) + backgroundColor = .systemGray6 + NSLayoutConstraint.activate([ + width, + bottomAnchor.constraint(equalTo: controls.bottomAnchor) + ]) + layer.cornerRadius = 22 + widthConstraint = width + + case .navbar: + let width = widthAnchor.constraint(equalToConstant: 150) + backgroundColor = .systemGray6 + NSLayoutConstraint.activate([ + width, + bottomAnchor.constraint(equalTo: controls.bottomAnchor) + ]) + layer.cornerRadius = 22 + widthConstraint = width + + case .bottomToolbar: + backgroundColor = Asset.Colors.navbarBackground.color + layer.cornerRadius = 0 + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func update(toRotation rotation: AnnotationToolbarViewController.Rotation) { + switch rotation { + case .horizontal: + widthConstraint?.constant = 150 + heightConstraint?.constant = 44 + controlsView.axis = .horizontal + + case .vertical: + widthConstraint?.constant = 44 + heightConstraint?.constant = 150 + controlsView.axis = .vertical + } + } +} diff --git a/Zotero/Scenes/General/Views/AccessibilityViewHandler.swift b/Zotero/Scenes/General/Views/AccessibilityViewHandler.swift new file mode 100644 index 000000000..23089eff3 --- /dev/null +++ b/Zotero/Scenes/General/Views/AccessibilityViewHandler.swift @@ -0,0 +1,200 @@ +// +// AccessibilityViewHandler.swift +// Zotero +// +// Created by Michal Rentka on 01.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import AVFAudio +import UIKit + +protocol AccessibilityViewDelegate: AnyObject { + var isNavigationBarHidden: Bool { get } + func showAccessibilityPopup( + speechManager: SpeechManager, + sender: UIBarButtonItem, + animated: Bool, + isFormSheet: @escaping () -> Bool, + dismissAction: @escaping () -> Void, + voiceChangeAction: @escaping (AVSpeechSynthesisVoice) -> Void + ) + func accessibilityToolbarChanged(height: CGFloat) + func addAccessibilityControlsViewToAnnotationToolbar(view: AnnotationToolbarLeadingView) + func removeAccessibilityControlsViewFromAnnotationToolbar() +} + +final class AccessibilityViewHandler { + let navbarButtonTag = 4 + private unowned let viewController: UIViewController + private unowned let documentContainer: UIView + private unowned let dbStorage: DbStorage + let speechManager: SpeechManager + private let key: String + private let libraryId: LibraryIdentifier + + private weak var activeOverlay: AccessibilitySpeechControlsView? + weak var delegate: AccessibilityViewDelegate? + var isFormSheet: Bool { + // Detecting horizontalSizeClass == .compact is not reliable, as the controller can still be shown as formSheet even when horizontalSizeClass is .regular. Therefore the safest way to check + // whether the controller is shown as form sheet or popover is to check view size. However the controller doesn't have to be visible all the time, so when the controller is not visible, + // we just check the size class. This way there can be discrepancies between popover/formSheet and overlay/toolbar, but realistically most people won't really see this. + if UIDevice.current.userInterfaceIdiom == .phone { + return true + } + if let presentedViewController = viewController.presentedViewController { + return viewController.view.frame.width == presentedViewController.view.frame.width + } else { + return viewController.traitCollection.horizontalSizeClass == .compact + } + } + + init(key: String, libraryId: LibraryIdentifier, viewController: UIViewController, documentContainer: UIView, delegate: Delegate, dbStorage: DbStorage) { + self.key = key + self.libraryId = libraryId + self.viewController = viewController + self.documentContainer = documentContainer + self.dbStorage = dbStorage + let language = try? dbStorage.perform(request: ReadSpeechLanguageDbRequest(key: key, libraryId: libraryId), on: .main) + speechManager = SpeechManager(delegate: delegate, speechRateModifier: Defaults.shared.speechRateModifier, voiceLanguage: language) + } + + func createAccessibilityButton(isSelected: Bool, isFilled: Bool, isEnabled: Bool = true) -> UIBarButtonItem { + let button = CheckboxButton( + image: UIImage(systemName: isFilled ? "text.page.fill" : "text.page", withConfiguration: UIImage.SymbolConfiguration(scale: .large))!.withRenderingMode(.alwaysTemplate), + contentInsets: NSDirectionalEdgeInsets(top: 9, leading: 6, bottom: 9, trailing: 6) + ) + button.showsLargeContentViewer = true + button.accessibilityLabel = L10n.Accessibility.openDocumentAccessibility + button.deselectedBackgroundColor = .clear + button.deselectedTintColor = isEnabled ? Asset.Colors.zoteroBlueWithDarkMode.color : .gray + button.selectedBackgroundColor = Asset.Colors.zoteroBlue.color + button.selectedTintColor = .white + button.isSelected = isSelected + button.isEnabled = isEnabled + let item = UIBarButtonItem(customView: button) + item.tag = navbarButtonTag + button.addAction( + UIAction(handler: { [weak self, weak item] _ in + guard let self, let item else { return } + showSpeech(sender: item) + }), + for: .touchUpInside + ) + return item + } + + func showSpeech(sender: UIBarButtonItem? = nil, isCompact: Bool = false, animated: Bool = true) { + guard let sender = sender ?? viewController.navigationItem.leftBarButtonItems?.first(where: { $0.tag == navbarButtonTag }) else { return } + hideOverlay() + reloadSpeechButton(isSelected: true) + delegate?.showAccessibilityPopup( + speechManager: speechManager, + sender: sender, + animated: animated, + isFormSheet: { [weak self] in self?.isFormSheet ?? false }, + dismissAction: { [weak self] in + guard let self else { return } + showOverlayIfNeeded(forType: currentOverlayType(controller: self)) + reloadSpeechButton(isSelected: false) + }, + voiceChangeAction: { [weak self] voice in + self?.processVoiceChange(toVoice: voice) + } + ) + + func currentOverlayType(controller: AccessibilityViewHandler) -> AccessibilitySpeechControlsView.Kind { + if controller.isFormSheet { + return .bottomToolbar + } else if !(controller.delegate?.isNavigationBarHidden ?? true) { + return .navbar + } else { + return .annotationToolbar + } + } + } + + private func processVoiceChange(toVoice voice: AVSpeechSynthesisVoice) { + try? dbStorage.perform(request: SetSpeechLanguageDbRequest(key: key, libraryId: libraryId, language: voice.baseLanguage), on: .main) + speechManager.set(voice: voice) + } + + private func reloadSpeechButton(isSelected: Bool) { + guard let index = viewController.navigationItem.leftBarButtonItems?.firstIndex(where: { $0.tag == navbarButtonTag }) else { return } + (viewController.navigationItem.leftBarButtonItems?[index].customView as? CheckboxButton)?.isSelected = isSelected + } + + func accessibilityControlsShouldChange(isNavbarHidden: Bool) { + guard activeOverlay != nil else { return } + let type: AccessibilitySpeechControlsView.Kind + if isFormSheet { + type = .bottomToolbar + } else if !isNavbarHidden { + type = .navbar + } else { + type = .annotationToolbar + } + showOverlayIfNeeded(forType: type) + } + + private func showOverlayIfNeeded(forType type: AccessibilitySpeechControlsView.Kind) { + guard speechManager.state.value != .stopped, activeOverlay?.type != type else { return } + + if let activeOverlay { + remove(activeControls: activeOverlay) + } + + let overlay = AccessibilitySpeechControlsView(type: type, speechManager: speechManager) + activeOverlay = overlay + + switch type { + case .bottomToolbar: + showAsBottomToolbar() + + case .annotationToolbar: + delegate?.addAccessibilityControlsViewToAnnotationToolbar(view: overlay) + + case .navbar: + showInNavigationBar() + } + + func showAsBottomToolbar() { + viewController.view.addSubview(overlay) + + NSLayoutConstraint.activate([ + overlay.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor), + overlay.leadingAnchor.constraint(equalTo: documentContainer.leadingAnchor), + overlay.trailingAnchor.constraint(equalTo: documentContainer.trailingAnchor), + overlay.controlsView.bottomAnchor.constraint(equalTo: viewController.view.safeAreaLayoutGuide.bottomAnchor) + ]) + + delegate?.accessibilityToolbarChanged(height: overlay.frame.height) + viewController.view.layoutIfNeeded() + } + + func showInNavigationBar() { + viewController.navigationItem.titleView = overlay + } + } + + private func hideOverlay() { + guard let activeOverlay else { return } + remove(activeControls: activeOverlay) + self.activeOverlay = nil + viewController.view.layoutIfNeeded() + } + + private func remove(activeControls: AccessibilitySpeechControlsView) { + switch activeControls.type { + case .navbar: + viewController.navigationItem.titleView = nil + + case .bottomToolbar: + delegate?.accessibilityToolbarChanged(height: 0) + activeControls.removeFromSuperview() + + case .annotationToolbar: + delegate?.removeAccessibilityControlsViewFromAnnotationToolbar() + } + } +} diff --git a/Zotero/Scenes/General/Views/SpeechLanguagePickerView.swift b/Zotero/Scenes/General/Views/SpeechLanguagePickerView.swift new file mode 100644 index 000000000..dd3e5324d --- /dev/null +++ b/Zotero/Scenes/General/Views/SpeechLanguagePickerView.swift @@ -0,0 +1,56 @@ +// +// SpeechLanguagePickerView.swift +// Zotero +// +// Created by Michal Rentka on 22.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import AVFAudio +import SwiftUI + +struct SpeechLanguagePickerView: View { + private struct Language: Identifiable { + let id: String + let name: String + } + + private let languages: [Language] + @Binding private var selectedLanguage: String + @Binding private var navigationPath: NavigationPath + + init(selectedLanguage: Binding, navigationPath: Binding) { + _selectedLanguage = selectedLanguage + _navigationPath = navigationPath + let voices = AVSpeechSynthesisVoice.speechVoices() + languages = Locale.availableIdentifiers + .filter({ languageId in !languageId.contains("_") && voices.contains(where: { $0.language.contains(languageId) }) }) + .map({ Language(id: $0, name: Locale.current.localizedString(forIdentifier: $0) ?? $0) }) + .sorted(by: { $0.name.caseInsensitiveCompare($1.name) == .orderedAscending }) + } + + var body: some View { + List { + Section { + ForEach(languages) { language in + HStack { + Text(language.name) + Spacer() + if selectedLanguage == language.id { + Image(systemName: "checkmark").foregroundColor(Asset.Colors.zoteroBlueWithDarkMode.swiftUIColor) + } + } + .contentShape(Rectangle()) + .onTapGesture { + selectedLanguage = language.id + navigationPath.removeLast() + } + } + } + } + } +} + +#Preview { + SpeechLanguagePickerView(selectedLanguage: .constant("en"), navigationPath: .constant(.init())) +} diff --git a/Zotero/Scenes/General/Views/SpeechVoicePickerView.swift b/Zotero/Scenes/General/Views/SpeechVoicePickerView.swift new file mode 100644 index 000000000..f6e06a8f2 --- /dev/null +++ b/Zotero/Scenes/General/Views/SpeechVoicePickerView.swift @@ -0,0 +1,195 @@ +// +// SpeechVoicePickerView.swift +// Zotero +// +// Created by Michal Rentka on 18.07.2025. +// Copyright © 2025 Corporation for Digital Scholarship. All rights reserved. +// + +import AVFAudio +import SwiftUI + +import CocoaLumberjackSwift + +struct SpeechVoicePickerView: View { + fileprivate struct Variation: Identifiable { + var id: String + let name: String + } + + private let dismiss: (AVSpeechSynthesisVoice) -> Void + + @State private var language: String + @State private var selectedVariation: String + @State private var variations: [Variation] + @State private var selectedVoice: AVSpeechSynthesisVoice + @State private var voices: [AVSpeechSynthesisVoice] + @State private var navigationPath: NavigationPath + + init(selectedVoice: AVSpeechSynthesisVoice, dismiss: @escaping (AVSpeechSynthesisVoice) -> Void) { + var language = selectedVoice.language + var variation = selectedVoice.language + if language.contains("-") { + let split = language.split(separator: "-") + language = String(split[0]) + variation = split[0] + "_" + split[1] + } + self.selectedVoice = selectedVoice + self.language = language + self.dismiss = dismiss + navigationPath = NavigationPath() + selectedVariation = variation + (variations, voices) = Self.voicesAndVariations(for: language, voicesForVariation: selectedVoice.language) + } + + var body: some View { + NavigationStack(path: $navigationPath) { + List { + LanguageSection(language: $language, navigationPath: $navigationPath) + if variations.count > 1 { + VariationsSection(variations: $variations, selectedVariation: $selectedVariation) + } + VoicesSection(voices: $voices, selectedVoice: $selectedVoice) + } + .listStyle(.grouped) + .navigationTitle("Voice") + .navigationBarTitleDisplayMode(.inline) + .navigationDestination(for: String.self, destination: { value in + if value == "languages" { + SpeechLanguagePickerView(selectedLanguage: $language, navigationPath: $navigationPath) + } + }) + .onChange(of: language) { newValue in + (variations, voices) = Self.voicesAndVariations(for: newValue) + selectedVariation = variations.first?.id ?? selectedVariation + selectedVoice = voices.first ?? selectedVoice + } + .onChange(of: selectedVariation) { variation in + voices = Self.voices(for: variation.replacingOccurrences(of: "_", with: "-")) + selectedVoice = voices.first ?? selectedVoice + } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button { + dismiss(selectedVoice) + } label: { + Text("Close") + } + } + } + } + } + + private static func voicesAndVariations(for language: String, voicesForVariation variation: String? = nil) -> (variations: [Variation], voices: [AVSpeechSynthesisVoice]) { + let allVoices = AVSpeechSynthesisVoice.speechVoices() + let locale = Locale.current + let variations = Locale.availableIdentifiers + .filter({ variation in variation.hasPrefix(language) && allVoices.contains(where: { $0.language == variation.replacingOccurrences(of: "_", with: "-") }) }) + .map({ Variation(id: $0, name: convertVariationName(for: $0)) }) + .sorted(by: { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }) + let voices = allVoices.filter({ $0.language == (variation ?? variations.first?.id) }).sorted(by: { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }) + return (variations, voices) + + func convertVariationName(for identifier: String) -> String { + guard let localized = locale.localizedString(forIdentifier: identifier) else { return identifier } + guard let localizedLanguage = locale.localizedString(forLanguageCode: language), localized.contains(localizedLanguage) else { return localized } + return localized.replacingOccurrences(of: localizedLanguage, with: "").trimmingCharacters(in: CharacterSet(charactersIn: " ()")) + } + } + + private static func voices(for variation: String) -> [AVSpeechSynthesisVoice] { + return AVSpeechSynthesisVoice.speechVoices() + .filter({ $0.language == variation }) + .sorted(by: { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }) + } +} + +// swiftlint:disable private_over_fileprivate +fileprivate struct LanguageSection: View { + @Binding var language: String + @Binding var navigationPath: NavigationPath + + var body: some View { + Section { + HStack { + Text("Language") + Spacer() + Text(Locale.current.localizedString(forLanguageCode: language) ?? "Unknown").foregroundColor(.gray) + Image(systemName: "chevron.right") + .foregroundColor(.gray) + .font(.system(size: 13, weight: .semibold)) + } + .contentShape(Rectangle()) + .onTapGesture { + navigationPath.append("languages") + } + } + } +} + +fileprivate struct VariationsSection: View { + @Binding var variations: [SpeechVoicePickerView.Variation] + @Binding var selectedVariation: String + + var body: some View { + Section("VARIATIONS") { + ForEach(variations) { variation in + HStack { + Text(variation.name) + Spacer() + if selectedVariation == variation.id { + Image(systemName: "checkmark").foregroundColor(Asset.Colors.zoteroBlueWithDarkMode.swiftUIColor) + } + } + .contentShape(Rectangle()) + .onTapGesture { + selectedVariation = variation.id + } + } + } + } +} + +fileprivate struct VoicesSection: View { + private let synthetizer: AVSpeechSynthesizer = .init() + + @Binding var voices: [AVSpeechSynthesisVoice] + @Binding var selectedVoice: AVSpeechSynthesisVoice + + var body: some View { + Section("VOICES") { + ForEach(voices) { voice in + HStack { + Text(voice.name) + Spacer() + if selectedVoice == voice { + Image(systemName: "checkmark").foregroundColor(Asset.Colors.zoteroBlueWithDarkMode.swiftUIColor) + } + } + .contentShape(Rectangle()) + .onTapGesture { + selectedVoice = voice + playSample(withVoice: voice) + } + } + } + } + + private func playSample(withVoice voice: AVSpeechSynthesisVoice) { + if synthetizer.isSpeaking { + synthetizer.stopSpeaking(at: .immediate) + } + let utterance = AVSpeechUtterance(string: "My name is \(voice.name) and this is my voice") + utterance.voice = voice + synthetizer.speak(utterance) + } +} +// swiftlint:enable private_over_fileprivate + +#Preview { + SpeechVoicePickerView(selectedVoice: AVSpeechSynthesisVoice.speechVoices().first!, dismiss: { _ in }) +} + +extension AVSpeechSynthesisVoice: @retroactive Identifiable { + public var id: String { identifier } +} From e89dd8e5c2f1f03121f0aa1616f6a480591ace27 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 23 Dec 2025 14:34:04 -0500 Subject: [PATCH 40/75] Tweak localizable strings --- Zotero/Assets/en.lproj/Localizable.strings | 74 +++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 53108624a..b0f45265f 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -62,8 +62,8 @@ "beta_wipe_title" = "Resync Required"; "beta_wipe_message" = "Due to a beta update, your data must be redownloaded from zotero.org."; -"migration_debug" = "App failed to initialize and can’t function properly. Please report Debug ID %@ in the Zotero Forums."; -"login_debug" = "App failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; "full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; "day_suffixes" = "st,nd,rd,th"; @@ -280,7 +280,7 @@ "pdf.export.export_annotated" = "Export Annotated PDF"; "pdf.sidebar.no_annotations" = "No Annotations"; "pdf.sidebar.no_outline" = "No Outline"; -"pdf.delete_annotation" = "Do you really want to delete annotation?"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; "pdf.previous_page" = "Previous Page"; "pdf.next_page" = "Next Page"; "pdf.previous_viewport" = "Previous Viewport"; @@ -291,8 +291,8 @@ "settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; "settings.general.title" = "General"; "settings.general.show_subcollections_title" = "Show Items from Subcollections"; -"settings.general.show_collection_item_counts" = "Show collection sizes"; -"settings.general.open_links_in_external_browser" = "Open links in external browser"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; "settings.general.autoempty_title" = "Delete Items in Trash"; "settings.general.never" = "Never"; "settings.item_count" = "Item count"; @@ -325,7 +325,7 @@ "settings.view_output" = "View Output"; "settings.clear_output" = "Clear Output"; "settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; -"settings.logging_desc2" = "To debug a share extension issue, open the share extension."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; "settings.send_manually" = "Send Manually"; "settings.log_alert.progress_title" = "Sending Logs"; "settings.log_alert.title" = "Logs Sent"; @@ -375,7 +375,7 @@ "shareext.translation.item_selection" = "Choose an item"; "shareext.translation.translating_with" = "Saving with %@"; "shareext.loading_collections" = "Loading Collections"; -"shareext.sync_error" = "Can't sync collections"; +"shareext.sync_error" = "Unable to sync collections"; "shareext.collection_other" = "More"; "shareext.item_title" = "Item"; "shareext.collection_title" = "Collection"; @@ -392,14 +392,14 @@ "errors.versionMismatch" = "A remote change was made during the sync"; "errors.unknown" = "Unknown error"; "errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; -"errors.attachments.incompatible_attachment" = "Linked files are not supported on iOS. You can open them using the Zotero desktop app."; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; "errors.attachments.cant_open_attachment" = "The attached file could not be found."; "errors.attachments.missing_zotero" = "The attached file is not available in the online library."; "errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; "errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; "errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; -"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your access. Try waiting for a while or check your login credentials."; -"errors.attachments.too_many_requests" = "Our server is limiting your access. Try waiting for a while."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; "errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; "errors.attachments.generic_filename" = "the file"; "errors.login.invalid_password" = "Invalid password"; @@ -408,8 +408,8 @@ "errors.libraries.cantLoad" = "Unable to load libraries"; "errors.collections.empty_name" = "Please enter a collection name"; "errors.collections.save_failed" = "Unable to save collection"; -"errors.collections.bibliography_failed" = "Could not load items for bibliography."; -"errors.sync.group_removed" = "Group “%@” is no longer accessible. What would you like to do?"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; "errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; "errors.sync.revert_to_original" = "Revert to original"; "errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; @@ -434,27 +434,27 @@ "errors.sync_toolbar.forbidden" = "Invalid username or password"; "errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; "errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; -"errors.items.loading" = "Could not load items."; -"errors.items.deletion" = "Could not remove item."; -"errors.items.deletion_from_collection" = "Could not remove item from collection."; -"errors.items.add_to_collection" = "Could not add item to collection."; -"errors.items.move_item" = "Could not move item."; -"errors.items.save_note" = "Could not save note."; -"errors.items.add_attachment" = "Could not add attachment."; -"errors.items.add_some_attachments" = "Some attachments were not added: %@."; -"errors.items.load_duplication" = "Could not load item to duplicate."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; "errors.items.generating_bib" = "Could not generate bibliography"; "errors.citation_preview" = "Could not generate citation preview"; "errors.item_detail.dropped_fields_title" = "Change Item Type"; "errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; "errors.item_detail.cant_load_data" = "Could not load data. Please try again."; "errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; -"errors.item_detail.cant_create_attachments" = "Could not create attachments."; -"errors.item_detail.cant_save_note" = "Could not save note."; -"errors.item_detail.cant_save_changes" = "Could not save changes."; -"errors.item_detail.cant_trash_item" = "Could not move item to trash."; -"errors.item_detail.cant_save_tags" = "Could not save tags."; -"errors.item_detail.unsupported_type" = "Type \"%@\" not supported."; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; "errors.settings.storage" = "Could not collect storage data"; "errors.settings.webdav.file_missing_after_upload" = "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."; "errors.settings.webdav.invalid_url" = "WebDAV verification error"; @@ -503,25 +503,25 @@ "errors.logging.response_parsing" = "Unexpected response from server"; "errors.translators.bundle_loading" = "Could not update translators from bundle. Would you like to try again?"; "errors.translators.bundle_reset" = "Could not load bundled translators."; -"errors.styles.addition" = "Could not add style “%@”."; -"errors.styles.deletion" = "Could not delete style “%@”."; -"errors.styles.loading" = "Could not load styles."; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; "errors.styles_search.loading" = "Could not load styles. Do you want to try again?"; -"errors.citation.generate_citation" = "Could not generate citation."; -"errors.citation.generate_bibliography" = "Could not generate bibliography."; -"errors.citation.invalid_types" = "Invalid item types selected."; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; "errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; "errors.citation.open_settings" = "Open Settings"; "errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; "errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; "errors.pdf.merge_too_big_title" = "Unable to merge annotations"; "errors.pdf.merge_too_big" = "The combined annotation would be too large."; -"errors.pdf.cant_update_annotation" = "Can’t update annotation."; -"errors.pdf.cant_add_annotations" = "Can’t add annotations."; -"errors.pdf.cant_delete_annotations" = "Can’t delete annotations."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; "errors.pdf.incompatible_document" = "This document is not supported."; "errors.pdf.empty_document" = "This document is empty."; -"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; "errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; "accessibility.untitled" = "Title"; From 6ed3b504c6577ad0d4bb1c615669fcd6c4887d4c Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 23 Dec 2025 22:25:15 -0500 Subject: [PATCH 41/75] Fix typo in Add by Identifier placeholder --- Zotero/Assets/en.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index b0f45265f..a94f1e7c6 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -150,7 +150,7 @@ "items.creator_summary.etal" = "%@ et al."; "items.retrieving_metadata" = "Retrieving Metadata"; -"lookup.title" = "Enter ISBNs, DOls, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; "citation.title" = "Citation Preview"; "citation.copy_citation" = "Copy Citation"; From 3631bcbf26ad2f28c2cf7126d68fa89398e25a85 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 23 Dec 2025 22:36:38 -0500 Subject: [PATCH 42/75] Additional string tweaks --- Zotero/Assets/en.lproj/Localizable.strings | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index a94f1e7c6..6c130826b 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -363,8 +363,8 @@ "settings.export_db" = "Export Database File"; "settings.full_sync_debug" = "Advanced"; "settings.full_sync.start" = "Start Full Sync Debugging"; -"settings.full_sync.other_in_progress" = "Sync is already in progress. Wait for it to finish."; -"settings.full_sync.in_progress" = "A full sync is in progress. Wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; "settings.annotation_tools" = "Annotation Tools"; "settings.annotation_tools.pdf" = "PDF"; "settings.annotation_tools.html_epub" = "HTML / EPUB"; @@ -491,9 +491,9 @@ "errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; "errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; "errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; -"errors.shareext.forbidden" = "You don’t have necessary rights to submit this item to %@."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; "errors.shareext.webdav_not_verified" = "WebDAV verification error"; -"errors.shareext.requires_browser" = "This page or app requires to be loaded in a browser in order to be shared with Zotero. Open it in your browser and use the browser's Share action."; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; "errors.db_failure" = "Error creating database. Please try logging in again."; "errors.logging.title" = "Debugging Error"; "errors.logging.start" = "Unable to start debug logging"; @@ -501,12 +501,12 @@ "errors.logging.no_logs_recorded" = "No debug output occurred during logging"; "errors.logging.upload" = "Could not upload logs. Please try again."; "errors.logging.response_parsing" = "Unexpected response from server"; -"errors.translators.bundle_loading" = "Could not update translators from bundle. Would you like to try again?"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; "errors.translators.bundle_reset" = "Could not load bundled translators."; "errors.styles.addition" = "Could not add style “%@”"; "errors.styles.deletion" = "Could not delete style “%@”"; "errors.styles.loading" = "Could not load styles"; -"errors.styles_search.loading" = "Could not load styles. Do you want to try again?"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; "errors.citation.generate_citation" = "Could not generate citation"; "errors.citation.generate_bibliography" = "Could not generate bibliography"; "errors.citation.invalid_types" = "Invalid item types selected"; From 67081198b6e982c060513cbdf314cae91b61265c Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 24 Dec 2025 16:19:22 +0200 Subject: [PATCH 43/75] Improve PDF worker controller (#1218) * Improve code * Improve code * Add PDFWork priority * Update PDFWorkerController tests * Improve code * Improve code * Improve PDFWorkerController to support workers with grouped works * Use single worker for extracting text for speech in PDF reader * Fix memory leak * Create PDFWorkerController web view handlers asynchronously --- Zotero.xcodeproj/project.pbxproj | 10 + Zotero/Controllers/PDFWorkerController.swift | 515 +++++++++++++----- Zotero/Controllers/RecognizerController.swift | 8 +- .../PDFWorkerWebViewHandler.swift | 33 +- .../Controllers/Web View Handling/worker.html | 8 +- .../PDF/Views/PDFReaderViewController.swift | 8 +- .../JSONs/bitcoin_pdf_page_0_text.json | 5 + .../JSONs/bitcoin_pdf_pages_0_1_text.json | 5 + ZoteroTests/PDFWorkerControllerSpec.swift | 87 ++- 9 files changed, 493 insertions(+), 186 deletions(-) create mode 100644 ZoteroTests/JSONs/bitcoin_pdf_page_0_text.json create mode 100644 ZoteroTests/JSONs/bitcoin_pdf_pages_0_1_text.json diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 6813d8c3b..5305d7ef1 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 6102D2BD2D6CCF7600505E6A /* RecognizerRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6102D2BB2D6CCF7600505E6A /* RecognizerRequest.swift */; }; 6102D2BF2D6E23D100505E6A /* worker.html in Resources */ = {isa = PBXBuildFile; fileRef = 6102D2BE2D6E23C400505E6A /* worker.html */; }; 6102D2C02D6E23D100505E6A /* worker.html in Resources */ = {isa = PBXBuildFile; fileRef = 6102D2BE2D6E23C400505E6A /* worker.html */; }; + 6108CF432EF1E80C00036576 /* bitcoin_pdf_pages_0_1_text.json in Resources */ = {isa = PBXBuildFile; fileRef = 6108CF422EF1E80C00036576 /* bitcoin_pdf_pages_0_1_text.json */; }; 61099E6E2C91BAF300EDD92C /* NSDecimalNumber+Rounding.m in Sources */ = {isa = PBXBuildFile; fileRef = 61099E6D2C91BAF300EDD92C /* NSDecimalNumber+Rounding.m */; }; 61099E6F2C91BAF300EDD92C /* NSDecimalNumber+Rounding.m in Sources */ = {isa = PBXBuildFile; fileRef = 61099E6D2C91BAF300EDD92C /* NSDecimalNumber+Rounding.m */; }; 61168F612D50D4B6005495E8 /* PDFWorkerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61168F602D50D4B6005495E8 /* PDFWorkerController.swift */; }; @@ -76,6 +77,8 @@ 61EB05B42C9D8EA200152482 /* CreateReaderAnnotationsDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61EB05B22C9D8EA200152482 /* CreateReaderAnnotationsDbRequest.swift */; }; 61FA14CE2B05081D00E7D423 /* TextConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FA14CD2B05081D00E7D423 /* TextConverter.swift */; }; 61FA14D02B08E24A00E7D423 /* ColorPickerStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FA14CF2B08E24A00E7D423 /* ColorPickerStackView.swift */; }; + 61FB13D72EECBE0A00329563 /* bitcoin_pdf_page_0_text.json in Sources */ = {isa = PBXBuildFile; fileRef = 61FB13D62EECBE0700329563 /* bitcoin_pdf_page_0_text.json */; }; + 61FB13D82EED6D6E00329563 /* bitcoin_pdf_page_0_text.json in Resources */ = {isa = PBXBuildFile; fileRef = 61FB13D62EECBE0700329563 /* bitcoin_pdf_page_0_text.json */; }; B300B33324291C8D00C1FE1E /* RTranslatorMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B300B33224291C8D00C1FE1E /* RTranslatorMetadata.swift */; }; B300B3352429222B00C1FE1E /* TranslatorMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B300B3342429222B00C1FE1E /* TranslatorMetadata.swift */; }; B300B3362429234C00C1FE1E /* TranslatorMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B300B3342429222B00C1FE1E /* TranslatorMetadata.swift */; }; @@ -1355,6 +1358,7 @@ 6102D2B72D6CCDD300505E6A /* RemoteRecognizerResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteRecognizerResponse.swift; sourceTree = ""; }; 6102D2BB2D6CCF7600505E6A /* RecognizerRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecognizerRequest.swift; sourceTree = ""; }; 6102D2BE2D6E23C400505E6A /* worker.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = worker.html; sourceTree = ""; }; + 6108CF422EF1E80C00036576 /* bitcoin_pdf_pages_0_1_text.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = bitcoin_pdf_pages_0_1_text.json; sourceTree = ""; }; 61099E6A2C91BAF300EDD92C /* Zotero-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Zotero-Bridging-Header.h"; sourceTree = ""; }; 61099E6B2C91BAF300EDD92C /* ZShare-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ZShare-Bridging-Header.h"; sourceTree = ""; }; 61099E6C2C91BAF300EDD92C /* NSDecimalNumber+Rounding.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDecimalNumber+Rounding.h"; sourceTree = ""; }; @@ -1391,6 +1395,7 @@ 61EB05B22C9D8EA200152482 /* CreateReaderAnnotationsDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateReaderAnnotationsDbRequest.swift; sourceTree = ""; }; 61FA14CD2B05081D00E7D423 /* TextConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextConverter.swift; sourceTree = ""; }; 61FA14CF2B08E24A00E7D423 /* ColorPickerStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerStackView.swift; sourceTree = ""; }; + 61FB13D62EECBE0700329563 /* bitcoin_pdf_page_0_text.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = bitcoin_pdf_page_0_text.json; sourceTree = ""; }; B300B33224291C8D00C1FE1E /* RTranslatorMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTranslatorMetadata.swift; sourceTree = ""; }; B300B3342429222B00C1FE1E /* TranslatorMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslatorMetadata.swift; sourceTree = ""; }; B300B3372429254900C1FE1E /* SyncTranslatorsDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncTranslatorsDbRequest.swift; sourceTree = ""; }; @@ -3154,6 +3159,8 @@ children = ( 6102D2B12D68ABD900505E6A /* bitcoin_pdf_recognizer_data.json */, 6102D2B52D68B5DE00505E6A /* bitcoin_pdf_full_text.json */, + 61FB13D62EECBE0700329563 /* bitcoin_pdf_page_0_text.json */, + 6108CF422EF1E80C00036576 /* bitcoin_pdf_pages_0_1_text.json */, B3B1EDFB2502498100D8BC1E /* collectionresponse_knownfields.json */, B3B1EDFC2502498100D8BC1E /* collectionresponse_unknownfields.json */, B3B1EDF32502456000D8BC1E /* itemresponse_knownfields.json */, @@ -4794,6 +4801,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 61FB13D82EED6D6E00329563 /* bitcoin_pdf_page_0_text.json in Resources */, B32A3C90248008A2009E2C5D /* translators.xml in Resources */, B3B1C5892665258400883597 /* bitcoin.pdf in Resources */, 6102D2B22D68ABF100505E6A /* bitcoin_pdf_recognizer_data.json in Resources */, @@ -4815,6 +4823,7 @@ B3B1EDF52502456000D8BC1E /* itemresponse_knownfields.json in Resources */, B36B8A542A4C2E930038BA1C /* test_annotation_dictionary_position.json in Resources */, 6102D2B62D68B5E800505E6A /* bitcoin_pdf_full_text.json in Resources */, + 6108CF432EF1E80C00036576 /* bitcoin_pdf_pages_0_1_text.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5919,6 +5928,7 @@ 6144B5E12A4AE95E00914B3C /* WebDavControllerSpec.swift in Sources */, B3518DA72AEBCB5E00D983B4 /* SettingsResponseSpec.swift in Sources */, 6144B5D82A4ADDC400914B3C /* ItemTitleFormatterSpec.swift in Sources */, + 61FB13D72EECBE0A00329563 /* bitcoin_pdf_page_0_text.json in Sources */, 6144B5DF2A4AE48F00914B3C /* SyncControllerSpec.swift in Sources */, B3243BC82A5EB2740033A7D6 /* HtmlAttributedStringConverterSpec.swift in Sources */, 61AD977D2D67F42A000FDF45 /* PDFWorkerControllerSpec.swift in Sources */, diff --git a/Zotero/Controllers/PDFWorkerController.swift b/Zotero/Controllers/PDFWorkerController.swift index 8e83a412e..913ab4130 100644 --- a/Zotero/Controllers/PDFWorkerController.swift +++ b/Zotero/Controllers/PDFWorkerController.swift @@ -15,14 +15,96 @@ import RxSwift final class PDFWorkerController { // MARK: Types - struct PDFWork: Hashable { - enum Kind: Hashable { - case recognizer - case fullText(pages: [Int]) + enum Priority { + case `default` + case high + + var maxConcurrentWorkers: Int { + switch self { + case .default: + return 1 + + case .high: + return 3 + } + } + + static var inDescendingOrder: [Self] { + return [.high, .default] + } + } + + class Worker: Hashable { + enum State: CaseIterable { + case pending + case preparing + case ready + case queued + case running + case failed } + let id = UUID() let file: FileData - let kind: Kind + let priority: Priority + fileprivate(set) var state: State = .pending + fileprivate var subjectsByWork: OrderedDictionary> = [:] + fileprivate var webViewHandler: PDFWorkerWebViewHandler? + + init(file: FileData, priority: Priority) { + self.file = file + self.priority = priority + } + + deinit { + webViewHandler?.removeFromSuperviewAsynchronously() + } + + static func == (lhs: PDFWorkerController.Worker, rhs: PDFWorkerController.Worker) -> Bool { + lhs.id == rhs.id + } + + func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + } + + enum Work: Hashable { + case recognizer + case fullText(pages: [Int]?) + + var id: String { + switch self { + case .recognizer: + return "recognizer" + + case .fullText(let pages): + guard let pages else { return "fullText(pages: nil)" } + return "fullText(pages: [\(pages.map(String.init).joined(separator: ", "))])" + } + } + + init?(id: String) { + if id == "recognizer" { + self = .recognizer + return + } + let prefix = "fullText(pages: " + let suffix = ")" + guard id.hasPrefix(prefix), id.hasSuffix(suffix) else { return nil } + let pages = id.dropFirst(prefix.count).dropLast(suffix.count) + if pages == "nil" { + self = .fullText(pages: nil) + return + } + guard pages.hasPrefix("["), pages.hasSuffix("]") else { return nil } + var pageIndexes: [Int] = [] + for pageString in pages.dropFirst().dropLast().components(separatedBy: ", ") { + guard let pageIndex = Int(pageString) else { return nil } + pageIndexes.append(pageIndex) + } + self = .fullText(pages: pageIndexes) + } } struct Update { @@ -33,7 +115,7 @@ final class PDFWorkerController { case extractedData(data: [String: Any]) } - let work: PDFWork + let work: Work let kind: Kind } @@ -54,10 +136,12 @@ final class PDFWorkerController { } // Accessed only via accessQueue - private static let maxConcurrentPDFWorkers: Int = 1 - private var queue: [PDFWork] = [] - private var subjectsByPDFWork: [PDFWork: PublishSubject] = [:] - private var pdfWorkerWebViewHandlersByPDFWork: [PDFWork: PDFWorkerWebViewHandler] = [:] + private var preparing: Set = [] + private var ready: Set = [] + private var queuedByPriority: [Priority: OrderedSet] = [:] + private var runningByPriority: [Priority: OrderedSet] = [:] + private var failed: Set = [] + private var preparingPreloadedPDFWorkerWebViewHandler: Bool = false private var preloadedPDFWorkerWebViewHandler: PDFWorkerWebViewHandler? // MARK: Object Lifecycle @@ -71,194 +155,341 @@ final class PDFWorkerController { } // MARK: Actions - func queue(work: PDFWork) -> Observable { + private func updateStateAndQueues(for worker: Worker, state: Worker.State) { + // Is called only by callers already in the access queue. + worker.state = state + var queued = queuedByPriority[worker.priority, default: []] + var running = runningByPriority[worker.priority, default: []] + preparing.remove(worker) + ready.remove(worker) + queued.remove(worker) + running.remove(worker) + failed.remove(worker) + switch worker.state { + case .pending: + // Pending workers, i.e. worker that where initialized, but no work has been queued in them yet, and thus not prepared, are not kept in any structure. + break + + case .preparing: + preparing.insert(worker) + + case .ready: + ready.insert(worker) + + case .queued: + queued.append(worker) + + case .running: + running.append(worker) + + case .failed: + failed.insert(worker) + } + queuedByPriority[worker.priority] = queued + runningByPriority[worker.priority] = running + } + + func queue(work: Work, in worker: Worker) -> Observable { let subject = PublishSubject() accessQueue.async(flags: .barrier) { [weak self] in guard let self else { return } - if let existingSubject = subjectsByPDFWork[work] { + if let existingSubject = worker.subjectsByWork[work] { existingSubject.bind(to: subject).disposed(by: disposeBag) return } - queue.append(work) - subjectsByPDFWork[work] = subject - - startWorkIfNeeded() - } - return subject.asObservable() - } - - private func startWorkIfNeeded() { - guard pdfWorkerWebViewHandlersByPDFWork.count < Self.maxConcurrentPDFWorkers, !queue.isEmpty else { return } - let work = queue.removeFirst() - guard let subject = subjectsByPDFWork[work] else { - startWorkIfNeeded() - return - } - start(work: work, subject: subject) - startWorkIfNeeded() - - func start(work: PDFWork, subject: PublishSubject) { - var pdfWorkerWebViewHandler = pdfWorkerWebViewHandlersByPDFWork[work] - if pdfWorkerWebViewHandler == nil { + worker.subjectsByWork[work] = subject + switch worker.state { + case .pending, .failed: + // Assign preparing state and place in proper queue, then prepare web view handler. + updateStateAndQueues(for: worker, state: .preparing) + // Prepare web view handler. if let preloadedPDFWorkerWebViewHandler { - pdfWorkerWebViewHandler = preloadedPDFWorkerWebViewHandler - self.preloadedPDFWorkerWebViewHandler = nil + // There is a preloaded web view handler, worker can finish setup within the access queue. + if setup(pdfWorkerWebViewHandler: preloadedPDFWorkerWebViewHandler, for: worker) { + // Setup succeded, consume preloaded web view handler, assign queued state and place in proper queue. + self.preloadedPDFWorkerWebViewHandler = nil + updateStateAndQueues(for: worker, state: .queued) + // Start work if needed to run queued worker. + startWorkIfNeeded() + } else { + // Setup failed, assign failed state, so owner can either retry by queueing another work, or can cleanup. + updateStateAndQueues(for: worker, state: .failed) + } } else { - pdfWorkerWebViewHandler = createPDFWorkerWebViewHandler() + // A new web view handler needs to be created asynchronously, if successful. + createPDFWorkerWebViewHandler(fileStorage: fileStorage) { [weak self, weak worker] pdfWorkerWebViewHandler in + guard let self, let worker else { return } + guard let pdfWorkerWebViewHandler else { + // Failure happens within the access queue. + updateStateAndQueues(for: worker, state: .failed) + return + } + // Otherwise, a web view handler was created asynchronously, and completion is called within a new work in the access queue. + // Setup newly created web view handler. + if setup(pdfWorkerWebViewHandler: pdfWorkerWebViewHandler, for: worker) { + // Setup succeded, assign queued state and place in proper queue. + updateStateAndQueues(for: worker, state: .queued) + // Start work if needed to run queued worker. + startWorkIfNeeded() + } else { + // Setup failed, assign failed state, so owner can either retry by queueing another work, or can cleanup. + updateStateAndQueues(for: worker, state: .failed) + } + } } - pdfWorkerWebViewHandlersByPDFWork[work] = pdfWorkerWebViewHandler - } - guard let pdfWorkerWebViewHandler else { - DDLogError("PDFWorkerController: can't create PDFWorkerWebViewHandler instance") - cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .failed))) } - return - } - guard let workFileUrl = copyFileForPDFWorker(file: work.file, handler: pdfWorkerWebViewHandler) else { - cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .failed))) } - return - } + case .preparing: + // A new work is queued to a worker that is still preparing, do nothing. + break - setupObserver(for: pdfWorkerWebViewHandler) - subject.on(.next(Update(work: work, kind: .inProgress))) - switch work.kind { - case .recognizer: - pdfWorkerWebViewHandler.recognize(fileURL: workFileUrl) + case .ready: + // A new work is queued to a worker that is ready with no works (e.g. a worker that finished its works, but was kept by the user). + // Assign queued state, place in proper queue, and start work if needed. + updateStateAndQueues(for: worker, state: .queued) + startWorkIfNeeded() - case .fullText(let pages): - pdfWorkerWebViewHandler.getFullText(fileURL: workFileUrl, pages: pages) + case .queued: + // Already queued, just start work if needed. + startWorkIfNeeded() + + case .running: + // Already running, do nothing. + break } + } + return subject.asObservable() + } - func copyFileForPDFWorker(file: FileData, handler: PDFWorkerWebViewHandler) -> URL? { - let destination = handler.temporaryDirectory.copy(withName: file.name, ext: file.ext) - do { - try fileStorage.copy(from: file.createUrl().path, to: destination) - } catch { - DDLogError("PDFWorkerController: failed to copy file for PDF worker - \(error)") - return nil - } - return destination.createUrl() + private func setup(pdfWorkerWebViewHandler: PDFWorkerWebViewHandler, for worker: Worker) -> Bool { + guard copy(workFile: worker.file, to: pdfWorkerWebViewHandler) else { return false } + setupObserver(in: worker, for: pdfWorkerWebViewHandler) + worker.webViewHandler = pdfWorkerWebViewHandler + return true + + func copy(workFile file: FileData, to pdfWorkerWebViewHandler: PDFWorkerWebViewHandler) -> Bool { + if pdfWorkerWebViewHandler.workFile != nil { + // This shouldn't happen + DDLogWarn("PDFWorkerController: PDFWorkerWebViewHandler work file already set") + return true } + let destination = pdfWorkerWebViewHandler.temporaryDirectory.copy(withName: file.name, ext: file.ext) + do { + try fileStorage.copy(from: file.createUrl().path, to: destination) + } catch { + DDLogError("PDFWorkerController: failed to copy file for PDF worker - \(error)") + return false + } + pdfWorkerWebViewHandler.workFile = file + return true + } - func setupObserver(for pdfWorkerWebViewHandler: PDFWorkerWebViewHandler) { - pdfWorkerWebViewHandler.observable.subscribe(onNext: { [weak self] result in - guard let self else { return } - switch result { + func setupObserver(in worker: Worker, for pdfWorkerWebViewHandler: PDFWorkerWebViewHandler) { + pdfWorkerWebViewHandler.observable.subscribe(onNext: { [weak self, weak worker] event in + guard let self else { return } + accessQueue.async(flags: .barrier) { [weak self, weak worker] in + guard let self, let worker, let work = Work(id: event.workId), worker.subjectsByWork[work] != nil else { return } + switch event.result { case .success(let data): switch data { case .recognizerData(let data), .fullText(let data): - cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .extractedData(data: data)))) } + finishWork(work, in: worker) { $0?.on(.next(Update(work: work, kind: .extractedData(data: data)))) } } - + case .failure(let error): DDLogError("PDFWorkerController: recognizer failed - \(error)") - cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .failed))) } + finishWork(work, in: worker) { $0?.on(.next(Update(work: work, kind: .failed))) } } - }) - .disposed(by: disposeBag) - } + } + }) + .disposed(by: disposeBag) } } - func cancel(work: PDFWork) { - DDLogInfo("PDFWorkerController: cancelled \(work)") - cleanupPDFWorker(for: work) { $0?.on(.next(Update(work: work, kind: .cancelled))) } + private func startWorkIfNeeded() { + var worker: Worker? + for priority in Priority.inDescendingOrder { + let queued = queuedByPriority[priority, default: []] + if !queued.isEmpty, runningByPriority[priority, default: []].count < priority.maxConcurrentWorkers { + worker = queued.first + // Since queued is not empty, we are certain that worker is not nil, so break from the for loop. + // The new worker state and queue to be appended to, will be made in a subsequent updateStateAndQueues call. + break + } + } + guard let worker else { return } + guard let pdfWorkerWebViewHandler = worker.webViewHandler, let work = worker.subjectsByWork.keys.first, let subject = worker.subjectsByWork[work] else { + // This shouldn't happen, move worker back to ready state. + updateStateAndQueues(for: worker, state: .ready) + startWorkIfNeeded() + return + } + // Set worker state to running and append to proper queue. + updateStateAndQueues(for: worker, state: .running) + // Start work. + subject.on(.next(Update(work: work, kind: .inProgress))) + switch work { + case .recognizer: + pdfWorkerWebViewHandler.recognize(workId: work.id) + + case .fullText(let pages): + pdfWorkerWebViewHandler.getFullText(pages: pages, workId: work.id) + } + // Start another work if needed. + startWorkIfNeeded() } - func cancellAllWorks() { - accessQueue.async(flags: .barrier) { [weak self] in - guard let self else { return } - DDLogInfo("PDFWorkerController: cancel all works") - // Immediatelly release all PDFWorker web views. - pdfWorkerWebViewHandlersByPDFWork.values.forEach { $0.removeFromSuperviewAsynchronously() } - pdfWorkerWebViewHandlersByPDFWork = [:] - // Then cancel actual works, and send cancelled event for each queued work. - let works = subjectsByPDFWork.keys + queue - for work in works { - cancel(work: work) + private func finishWork(_ work: Work, in worker: Worker, completion: ((_ subject: PublishSubject?) -> Void)?) { + if DispatchQueue.getSpecific(key: dispatchSpecificKey) == accessQueueLabel { + finishWork(work, worker: worker, completion: completion, controller: self) + } else { + accessQueue.async(flags: .barrier) { [weak self] in + guard let self else { return } + finishWork(work, worker: worker, completion: completion, controller: self) } } + + func finishWork(_ work: Work, worker: Worker, completion: ((_ subject: PublishSubject?) -> Void)?, controller: PDFWorkerController) { + let subject = worker.subjectsByWork.removeValue(forKey: work) + controller.updateStateAndQueues(for: worker, state: worker.subjectsByWork.isEmpty ? .ready : .queued) + DDLogInfo("PDFWorkerController: finished \(work) in \(worker)") + completion?(subject) + controller.startWorkIfNeeded() + } } - private func cleanupPDFWorker(for work: PDFWork, completion: ((_ subject: PublishSubject?) -> Void)?) { + func cancelWork(_ work: Work, in worker: Worker) { + DDLogInfo("PDFWorkerController: cancelled \(work) in \(worker)") + finishWork(work, in: worker) { $0?.on(.next(Update(work: work, kind: .cancelled))) } + } + + func cancelAllWorks(in worker: Worker, startNextWorkIfNeeded: Bool = true) { if DispatchQueue.getSpecific(key: dispatchSpecificKey) == accessQueueLabel { - cleanup(for: work, completion: completion, controller: self) + cancelAllWorks(in: worker, startNextWorkIfNeeded: startNextWorkIfNeeded, controller: self) } else { accessQueue.async(flags: .barrier) { [weak self] in guard let self else { return } - cleanup(for: work, completion: completion, controller: self) + cancelAllWorks(in: worker, startNextWorkIfNeeded: startNextWorkIfNeeded, controller: self) } } - func cleanup(for work: PDFWork, completion: ((_ subject: PublishSubject?) -> Void)?, controller: PDFWorkerController) { - let subject = controller.subjectsByPDFWork[work] - controller.queue.removeAll(where: { $0 == work }) - controller.subjectsByPDFWork[work] = nil - DDLogInfo("PDFWorkerController: cleaned up for \(work)") - controller.pdfWorkerWebViewHandlersByPDFWork.removeValue(forKey: work)?.removeFromSuperviewAsynchronously() - completion?(subject) + func cancelAllWorks(in worker: Worker, startNextWorkIfNeeded: Bool, controller: PDFWorkerController) { + DDLogInfo("PDFWorkerController: cancel all works in \(worker)") + // Immediatelly release worker web view handler and assign pending state to worker. If another work is queued for this worker, a new handler will be created. + worker.webViewHandler?.removeFromSuperviewAsynchronously() + worker.webViewHandler = nil + controller.updateStateAndQueues(for: worker, state: .pending) + for (work, subject) in worker.subjectsByWork { + subject.on(.next(Update(work: work, kind: .cancelled))) + } + worker.subjectsByWork.removeAll() + guard startNextWorkIfNeeded else { return } controller.startWorkIfNeeded() controller.preloadPDFWorkerIfIdle() } } - private func preloadPDFWorkerIfIdle() { - guard preloadedPDFWorkerWebViewHandler == nil, pdfWorkerWebViewHandlersByPDFWork.isEmpty else { return } - preloadedPDFWorkerWebViewHandler = createPDFWorkerWebViewHandler() + func cleanupWorker(_ worker: Worker) { + cancelAllWorks(in: worker) } - private func createPDFWorkerWebViewHandler() -> PDFWorkerWebViewHandler? { - guard let temporaryDirectory = prepareTemporaryWorkerDirectory() else { return nil } - let cleanupClosure: () -> Void = { [weak self] in - self?.accessQueue.async { [weak self] in - self?.removeTemporaryWorkerDirectory(temporaryDirectory) + func cancellAllWorks() { + accessQueue.async(flags: .barrier) { [weak self] in + guard let self else { return } + DDLogInfo("PDFWorkerController: cancel all works") + var workers: Set = [] + workers.formUnion(preparing) + workers.formUnion(ready) + for priority in Priority.inDescendingOrder { + workers.formUnion(queuedByPriority[priority, default: []]) + workers.formUnion(runningByPriority[priority, default: []]) + } + workers.formUnion(failed) + for worker in workers { + cancelAllWorks(in: worker, startNextWorkIfNeeded: false) } } + } - var pdfWorkerWebViewHandler: PDFWorkerWebViewHandler? - DispatchQueue.main.sync { [weak self] in - guard let self, let webViewProvider else { return } - let configuration = WKWebViewConfiguration() - configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") - let webView = webViewProvider.addWebView(configuration: configuration) - pdfWorkerWebViewHandler = PDFWorkerWebViewHandler(webView: webView, temporaryDirectory: temporaryDirectory, cleanup: cleanupClosure) - } - if pdfWorkerWebViewHandler == nil { - removeTemporaryWorkerDirectory(temporaryDirectory) + private func preloadPDFWorkerIfIdle() { + guard preloadedPDFWorkerWebViewHandler == nil, + !preparingPreloadedPDFWorkerWebViewHandler, + ready.isEmpty, + preparing.isEmpty, + !Priority.inDescendingOrder.contains(where: { !queuedByPriority[$0, default: []].isEmpty || !runningByPriority[$0, default: []].isEmpty }) + else { return } + preparingPreloadedPDFWorkerWebViewHandler = true + createPDFWorkerWebViewHandler(fileStorage: fileStorage) { [weak self] pdfWebViewHandler in + guard let self else { return } + preloadedPDFWorkerWebViewHandler = pdfWebViewHandler + preparingPreloadedPDFWorkerWebViewHandler = false } - return pdfWorkerWebViewHandler } - private func prepareTemporaryWorkerDirectory() -> File? { - guard let workerHtmlUrl = Bundle.main.url(forResource: "worker", withExtension: "html") else { - DDLogError("PDFWorkerController: worker.html not found") - return nil + private func createPDFWorkerWebViewHandler(fileStorage: FileStorage, completion: @escaping (PDFWorkerWebViewHandler?) -> Void) { + guard let temporaryDirectory = prepareTemporaryWorkerDirectory(fileStorage: fileStorage) else { + completion(nil) + return + } + let cleanupClosure: () -> Void = { [weak fileStorage] in + guard let fileStorage else { return } + removeTemporaryWorkerDirectory(temporaryDirectory, fileStorage: fileStorage) } - guard let workerJsUrl = Bundle.main.url(forResource: "worker", withExtension: "js", subdirectory: "Bundled/pdf_worker") else { - DDLogError("PDFWorkerController: worker.js not found") - return nil + + DispatchQueue.main.async { [weak self] in + guard let self else { + cleanupClosure() + return + } + guard let webViewProvider else { + accessQueue.async(flags: .barrier) { + completion(nil) + } + cleanupClosure() + return + } + let configuration = WKWebViewConfiguration() + configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") + let webView = webViewProvider.addWebView(configuration: configuration) + let pdfWorkerWebViewHandler = PDFWorkerWebViewHandler(webView: webView, temporaryDirectory: temporaryDirectory, cleanup: cleanupClosure) + accessQueue.async(flags: .barrier) { + completion(pdfWorkerWebViewHandler) + } } - let temporaryDirectory = Files.temporaryDirectory - do { - try fileStorage.copy(from: workerHtmlUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "html")) - try fileStorage.copy(from: workerJsUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "js")) - let cmapsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "cmaps") - try fileStorage.copyContents(of: cmapsDirectory, to: temporaryDirectory.appending(relativeComponent: "cmaps")) - let standardFontsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "standard_fonts") - try fileStorage.copyContents(of: standardFontsDirectory, to: temporaryDirectory.appending(relativeComponent: "standard_fonts")) - } catch { - DDLogError("PDFWorkerController: failed to prepare worker directory - \(error)") - removeTemporaryWorkerDirectory(temporaryDirectory) - return nil + + func prepareTemporaryWorkerDirectory(fileStorage: FileStorage) -> File? { + guard let workerHtmlUrl = Bundle.main.url(forResource: "worker", withExtension: "html") else { + DDLogError("PDFWorkerController: worker.html not found") + return nil + } + guard let workerJsUrl = Bundle.main.url(forResource: "worker", withExtension: "js", subdirectory: "Bundled/pdf_worker") else { + DDLogError("PDFWorkerController: worker.js not found") + return nil + } + let temporaryDirectory = Files.temporaryDirectory + do { + try fileStorage.copy(from: workerHtmlUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "html")) + try fileStorage.copy(from: workerJsUrl.path, to: temporaryDirectory.copy(withName: "worker", ext: "js")) + let cmapsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "cmaps") + try fileStorage.copyContents(of: cmapsDirectory, to: temporaryDirectory.appending(relativeComponent: "cmaps")) + let standardFontsDirectory = Files.file(from: workerJsUrl).directory.appending(relativeComponent: "standard_fonts") + try fileStorage.copyContents(of: standardFontsDirectory, to: temporaryDirectory.appending(relativeComponent: "standard_fonts")) + } catch { + DDLogError("PDFWorkerController: failed to prepare worker directory - \(error)") + removeTemporaryWorkerDirectory(temporaryDirectory, fileStorage: fileStorage) + return nil + } + return temporaryDirectory } - return temporaryDirectory - } - private func removeTemporaryWorkerDirectory(_ directory: File) { - do { - try fileStorage.remove(directory) - } catch { - DDLogError("PDFWorkerController: failed to remove worker directory - \(error)") + func removeTemporaryWorkerDirectory(_ directory: File, fileStorage: FileStorage) { + DispatchQueue.global(qos: .background).async { [weak fileStorage] in + guard let fileStorage else { return } + do { + try fileStorage.remove(directory) + } catch { + DDLogError("PDFWorkerController: failed to remove worker directory - \(error)") + } + } } } } diff --git a/Zotero/Controllers/RecognizerController.swift b/Zotero/Controllers/RecognizerController.swift index 929028613..c6de08804 100644 --- a/Zotero/Controllers/RecognizerController.swift +++ b/Zotero/Controllers/RecognizerController.swift @@ -182,22 +182,26 @@ final class RecognizerController { statesByTask[task] = .recognitionInProgress emmitUpdate(for: task, subject: subject, kind: .inProgress) - pdfWorkerController.queue(work: PDFWorkerController.PDFWork(file: task.file, kind: .recognizer)) + let worker = PDFWorkerController.Worker(file: task.file, priority: .default) + pdfWorkerController.queue(work: .recognizer, in: worker) .subscribe(onNext: { [weak self] update in guard let self else { return } switch update.kind { case .failed: + pdfWorkerController.cleanupWorker(worker) DDLogError("RecognizerController: \(task) - recognizer failed") cleanupTask(for: task) { $0?.on(.next(Update(task: task, kind: .failed(Error.recognizerFailed)))) } case .cancelled: + pdfWorkerController.cleanupWorker(worker) cleanupTask(for: task) { $0?.on(.next(Update(task: task, kind: .cancelled))) } case .inProgress: break case .extractedData(let data): - switch update.work.kind { + pdfWorkerController.cleanupWorker(worker) + switch update.work { case .recognizer: DDLogInfo("RecognizerController: \(task) - extracted recognizer data") startRemoteRecognition(for: task, with: data) diff --git a/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift b/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift index 19e24722e..ebff32c66 100644 --- a/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift +++ b/Zotero/Controllers/Web View Handling/PDFWorkerWebViewHandler.swift @@ -23,6 +23,10 @@ final class PDFWorkerWebViewHandler: WebViewHandler { case log = "logHandler" } + enum Error: Swift.Error { + case cantFindWorkFile + } + enum PDFWorkerData { case recognizerData(data: [String: Any]) case fullText(data: [String: Any]) @@ -30,8 +34,9 @@ final class PDFWorkerWebViewHandler: WebViewHandler { private let disposeBag: DisposeBag let temporaryDirectory: File + var workFile: File? private let cleanup: (() -> Void)? - let observable: PublishSubject> + let observable: PublishSubject<(workId: String, result: Result)> init(webView: WKWebView, temporaryDirectory: File, cleanup: (() -> Void)?) { self.temporaryDirectory = temporaryDirectory @@ -55,14 +60,14 @@ final class PDFWorkerWebViewHandler: WebViewHandler { return load(fileUrl: temporaryDirectory.copy(withName: "worker", ext: "html").createUrl()) } - private func performPDFWorkerOperation(fileURL: URL, operationName: String, jsFunction: String, additionalParams: [String] = []) { + private func performPDFWorkerOperation(operationName: String, jsFunction: String, additionalParams: [String] = [], workId: String) { performAfterInitialization() .observe(on: MainScheduler.instance) .flatMap { [weak self] _ -> Single in guard let self else { return .never() } + guard let workFile else { return .error(Error.cantFindWorkFile) } DDLogInfo("PDFWorkerWebViewHandler: call \(operationName) js") - let relativePath = fileURL.lastPathComponent - var javascript = "\(jsFunction)('\(escapeJavaScriptString(relativePath))'" + var javascript = "\(jsFunction)('\(workId)', '\(escapeJavaScriptString(workFile.fileName))'" if !additionalParams.isEmpty { javascript += ", " + additionalParams.joined(separator: ", ") } @@ -71,7 +76,7 @@ final class PDFWorkerWebViewHandler: WebViewHandler { } .subscribe(onFailure: { [weak self] error in DDLogError("PDFWorkerWebViewHandler: \(operationName) failed - \(error)") - self?.observable.on(.next(.failure(error))) + self?.observable.on(.next((workId: workId, result: .failure(error)))) }) .disposed(by: disposeBag) @@ -82,16 +87,16 @@ final class PDFWorkerWebViewHandler: WebViewHandler { } } - func recognize(fileURL: URL) { - performPDFWorkerOperation(fileURL: fileURL, operationName: "recognize", jsFunction: "recognize") + func recognize(workId: String) { + performPDFWorkerOperation(operationName: "recognize", jsFunction: "recognize", workId: workId) } - func getFullText(fileURL: URL, pages: [Int]?) { + func getFullText(pages: [Int]?, workId: String) { performPDFWorkerOperation( - fileURL: fileURL, operationName: "getFullText", jsFunction: "getFullText", - additionalParams: pages.flatMap({ ["[\($0.map({ "\($0)" }).joined(separator: ","))]"] }) ?? [] + additionalParams: pages.flatMap({ ["[\($0.map({ "\($0)" }).joined(separator: ","))]"] }) ?? [], + workId: workId ) } @@ -102,12 +107,12 @@ final class PDFWorkerWebViewHandler: WebViewHandler { switch handler { case .recognizerData: - guard let data = (body as? [String: Any])?["recognizerData"] as? [String: Any] else { return } - observable.on(.next(.success(.recognizerData(data: data)))) + guard let body = body as? [String: Any], let workId = body["workId"] as? String, let data = body["recognizerData"] as? [String: Any] else { return } + observable.on(.next((workId: workId, result: .success(.recognizerData(data: data))))) case .fullText: - guard let data = (body as? [String: Any])?["fullText"] as? [String: Any] else { return } - observable.on(.next(.success(.recognizerData(data: data)))) + guard let body = body as? [String: Any], let workId = body["workId"] as? String, let data = body["fullText"] as? [String: Any] else { return } + observable.on(.next((workId: workId, result: .success(.fullText(data: data))))) case .log: DDLogInfo("PDFWorkerWebViewHandler: JSLOG - \(body)") diff --git a/Zotero/Controllers/Web View Handling/worker.html b/Zotero/Controllers/Web View Handling/worker.html index 09b78c80e..cae8ab249 100644 --- a/Zotero/Controllers/Web View Handling/worker.html +++ b/Zotero/Controllers/Web View Handling/worker.html @@ -54,22 +54,22 @@ return arrayBuffer.slice(); } -async function recognize(filePath) { +async function recognize(workId, filePath) { try { let buf = await fetchLocalFile(filePath) let recognizerData = await query('getRecognizerData', { buf }, [buf]); - webkit.messageHandlers.recognizerDataHandler.postMessage({"recognizerData": recognizerData}); + webkit.messageHandlers.recognizerDataHandler.postMessage({"workId": workId, "recognizerData": recognizerData}); } catch (error) { log(`error: ${error}`); throw error; } } -async function getFullText(filePath, pageIndexes) { +async function getFullText(workId, filePath, pageIndexes) { try { let buf = await fetchLocalFile(filePath) let fulltext = await query('getFulltext', { buf, pageIndexes }, [buf]); - webkit.messageHandlers.fullTextHandler.postMessage({"fullText": fulltext}); + webkit.messageHandlers.fullTextHandler.postMessage({"workId": workId, "fullText": fulltext}); } catch (error) { log(`error: ${error}`); throw error; diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index 05134c170..2044aa74b 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -32,6 +32,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { private let viewModel: ViewModel private unowned let pdfWorkerController: PDFWorkerController + private var speechWorker: PDFWorkerController.Worker? let disposeBag: DisposeBag var state: PDFReaderState { return viewModel.state } @@ -383,6 +384,9 @@ class PDFReaderViewController: UIViewController, ReaderViewController { } deinit { + if let speechWorker { + pdfWorkerController.cleanupWorker(speechWorker) + } viewModel.process(action: .changeIdleTimerDisabled(false)) DDLogInfo("PDFReaderViewController deinitialized") } @@ -1032,8 +1036,10 @@ extension PDFReaderViewController: SpeechmanagerDelegate { completion(nil) return } + let speechWorker = speechWorker ?? PDFWorkerController.Worker(file: file as! FileData, priority: .high) + self.speechWorker = speechWorker let start = CFAbsoluteTimeGetCurrent() - pdfWorkerController.queue(work: .init(file: file as! FileData, kind: .fullText(pages: indices.map({ Int($0) })))) + pdfWorkerController.queue(work: .fullText(pages: indices.map({ Int($0) })), in: speechWorker) .observe(on: MainScheduler.instance) .subscribe(onNext: { update in switch update.kind { diff --git a/ZoteroTests/JSONs/bitcoin_pdf_page_0_text.json b/ZoteroTests/JSONs/bitcoin_pdf_page_0_text.json new file mode 100644 index 000000000..059bdba4c --- /dev/null +++ b/ZoteroTests/JSONs/bitcoin_pdf_page_0_text.json @@ -0,0 +1,5 @@ +{ + "totalPages" : 9, + "extractedPages" : 1, + "text" : "Bitcoin: A Peer-to-Peer Electronic Cash System\nSatoshi Nakamoto satoshin@gmx.com www.bitcoin.org\nAbstract. A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending. We propose a solution to the double-spending problem using a peer-to-peer network. The network timestamps transactions by hashing them into an ongoing chain of hash-based proof-of-work, forming a record that cannot be changed without redoing the proof-of-work. The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they'll generate the longest chain and outpace attackers. The network itself requires minimal structure. Messages are broadcast on a best effort basis, and nodes can leave and rejoin the network at will, accepting the longest proof-of-work chain as proof of what happened while they were gone.\n1. Introduction\nCommerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments. While the system works well enough for most transactions, it still suffers from the inherent weaknesses of the trust based model. Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for nonreversible services. With the possibility of reversal, the need for trust spreads. Merchants must be wary of their customers, hassling them for more information than they would otherwise need. A certain percentage of fraud is accepted as unavoidable. These costs and payment uncertainties can be avoided in person by using physical currency, but no mechanism exists to make payments over a communications channel without a trusted party. What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party. Transactions that are computationally impractical to reverse would protect sellers from fraud, and routine escrow mechanisms could easily be implemented to protect buyers. In this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed timestamp server to generate computational proof of the chronological order of transactions. The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.\n1" +} diff --git a/ZoteroTests/JSONs/bitcoin_pdf_pages_0_1_text.json b/ZoteroTests/JSONs/bitcoin_pdf_pages_0_1_text.json new file mode 100644 index 000000000..17e1963ea --- /dev/null +++ b/ZoteroTests/JSONs/bitcoin_pdf_pages_0_1_text.json @@ -0,0 +1,5 @@ +{ + "totalPages" : 9, + "extractedPages" : 2, + "text" : "Bitcoin: A Peer-to-Peer Electronic Cash System\nSatoshi Nakamoto satoshin@gmx.com www.bitcoin.org\nAbstract. A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending. We propose a solution to the double-spending problem using a peer-to-peer network. The network timestamps transactions by hashing them into an ongoing chain of hash-based proof-of-work, forming a record that cannot be changed without redoing the proof-of-work. The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they'll generate the longest chain and outpace attackers. The network itself requires minimal structure. Messages are broadcast on a best effort basis, and nodes can leave and rejoin the network at will, accepting the longest proof-of-work chain as proof of what happened while they were gone.\n1. Introduction\nCommerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments. While the system works well enough for most transactions, it still suffers from the inherent weaknesses of the trust based model. Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for nonreversible services. With the possibility of reversal, the need for trust spreads. Merchants must be wary of their customers, hassling them for more information than they would otherwise need. A certain percentage of fraud is accepted as unavoidable. These costs and payment uncertainties can be avoided in person by using physical currency, but no mechanism exists to make payments over a communications channel without a trusted party. What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party. Transactions that are computationally impractical to reverse would protect sellers from fraud, and routine escrow mechanisms could easily be implemented to protect buyers. In this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed timestamp server to generate computational proof of the chronological order of transactions. The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.\n1\n\n\n\f2. Transactions\nWe define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.\nThe problem of course is the payee can't verify that one of the owners did not double-spend the coin. A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank. We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.\n3. Timestamp Server\nThe solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [2-5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.\n2\nBlock\nItem Item ...\nHash\nBlock\nItem Item ...\nHash\nTransaction\nOwner 1's\nPublic Key\nOwner 0's\nSignature\nHash\nTransaction\nOwner 2's\nPublic Key\nOwner 1's\nSignature\nHash\nV e r i f y\nTransaction\nOwner 3's\nPublic Key\nOwner 2's\nSignature\nHash\nV e r i f y\nOwner 2's\nPrivate Key\nOwner 1's\nPrivate Key\nSign\nSign\nOwner 3's\nPrivate Key" +} diff --git a/ZoteroTests/PDFWorkerControllerSpec.swift b/ZoteroTests/PDFWorkerControllerSpec.swift index ee8d6d446..f0eb8339c 100644 --- a/ZoteroTests/PDFWorkerControllerSpec.swift +++ b/ZoteroTests/PDFWorkerControllerSpec.swift @@ -54,11 +54,12 @@ final class PDFWorkerControllerSpec: QuickSpec { expect(TestControllers.fileStorage.has(file)).to(beTrue()) it("can extract recognizer data") { - let work = PDFWorkerController.PDFWork(file: file, kind: .recognizer) + let work: PDFWorkerController.Work = .recognizer + let worker = PDFWorkerController.Worker(file: file, priority: .default) var emittedUpdates: [PDFWorkerController.Update.Kind] = [] waitUntil(timeout: .seconds(10)) { completion in - pdfWorkerController.queue(work: work) + pdfWorkerController.queue(work: work, in: worker) .subscribe(onNext: { update in expect(update.work).to(equal(work)) emittedUpdates.append(update.kind) @@ -74,30 +75,66 @@ final class PDFWorkerControllerSpec: QuickSpec { } expect(emittedUpdates.count).toEventually(equal(2), timeout: .seconds(20)) - for (index, update) in emittedUpdates.enumerated() { - switch update { - case .inProgress: - expect(index).to(equal(0)) + process(updates: emittedUpdates, jsonFileName: "bitcoin_pdf_recognizer_data") + } - case .extractedData(let data): - expect(index).to(equal(1)) - let recognizerDataURL = Bundle(for: Self.self).url(forResource: "bitcoin_pdf_recognizer_data", withExtension: "json")! - let recognizerData = try! Data(contentsOf: recognizerDataURL) - let recognizerJSONData = try! JSONSerialization.jsonObject(with: recognizerData, options: .allowFragments) as! [String: Any] - expect(data as? [String: AnyHashable]).to(equal(recognizerJSONData as! [String: AnyHashable])) + it("can extract full text") { + let work: PDFWorkerController.Work = .fullText(pages: nil) + let worker = PDFWorkerController.Worker(file: file, priority: .default) + var emittedUpdates: [PDFWorkerController.Update.Kind] = [] - default: - fail("unexpected update \(index): \(update)") - } + waitUntil(timeout: .seconds(20)) { completion in + pdfWorkerController.queue(work: work, in: worker) + .subscribe(onNext: { update in + expect(update.work).to(equal(work)) + emittedUpdates.append(update.kind) + switch update.kind { + case .failed, .cancelled, .extractedData: + completion() + + case .inProgress: + break + } + }) + .disposed(by: disposeBag) } + + expect(emittedUpdates.count).toEventually(equal(2), timeout: .seconds(20)) + process(updates: emittedUpdates, jsonFileName: "bitcoin_pdf_full_text") } - it("can extract full text") { - let work = PDFWorkerController.PDFWork(file: file, kind: .fullText) + it("can extract text from a single page") { + let work: PDFWorkerController.Work = .fullText(pages: [0]) + let worker = PDFWorkerController.Worker(file: file, priority: .default) + var emittedUpdates: [PDFWorkerController.Update.Kind] = [] + + waitUntil(timeout: .seconds(20)) { completion in + pdfWorkerController.queue(work: work, in: worker) + .subscribe(onNext: { update in + expect(update.work).to(equal(work)) + emittedUpdates.append(update.kind) + switch update.kind { + case .failed, .cancelled, .extractedData: + completion() + + case .inProgress: + break + } + }) + .disposed(by: disposeBag) + } + + expect(emittedUpdates.count).toEventually(equal(2), timeout: .seconds(20)) + process(updates: emittedUpdates, jsonFileName: "bitcoin_pdf_page_0_text") + } + + it("can extract text from two pages") { + let work: PDFWorkerController.Work = .fullText(pages: [0, 1]) + let worker = PDFWorkerController.Worker(file: file, priority: .default) var emittedUpdates: [PDFWorkerController.Update.Kind] = [] waitUntil(timeout: .seconds(20)) { completion in - pdfWorkerController.queue(work: work) + pdfWorkerController.queue(work: work, in: worker) .subscribe(onNext: { update in expect(update.work).to(equal(work)) emittedUpdates.append(update.kind) @@ -113,17 +150,21 @@ final class PDFWorkerControllerSpec: QuickSpec { } expect(emittedUpdates.count).toEventually(equal(2), timeout: .seconds(20)) - for (index, update) in emittedUpdates.enumerated() { + process(updates: emittedUpdates, jsonFileName: "bitcoin_pdf_pages_0_1_text") + } + + func process(updates: [PDFWorkerController.Update.Kind], jsonFileName: String) { + for (index, update) in updates.enumerated() { switch update { case .inProgress: expect(index).to(equal(0)) case .extractedData(let data): expect(index).to(equal(1)) - let fullTextURL = Bundle(for: Self.self).url(forResource: "bitcoin_pdf_full_text", withExtension: "json")! - let fullTextData = try! Data(contentsOf: fullTextURL) - let fullTextJSONData = try! JSONSerialization.jsonObject(with: fullTextData, options: .allowFragments) as! [String: Any] - expect(data as? [String: AnyHashable]).to(equal(fullTextJSONData as! [String: AnyHashable])) + let url = Bundle(for: Self.self).url(forResource: jsonFileName, withExtension: "json")! + let expectedData = try! Data(contentsOf: url) + let expectedJSONData = try! JSONSerialization.jsonObject(with: expectedData, options: .allowFragments) as! [String: Any] + expect(data as? [String: AnyHashable]).to(equal(expectedJSONData as! [String: AnyHashable])) default: fail("unexpected update \(index): \(update)") From da50212be2824588f14d82e62aaa7332cac9b7a9 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 24 Dec 2025 19:30:30 +0200 Subject: [PATCH 44/75] Make speech feature respect gate and disable it --- Zotero/Models/FeatureGates.swift | 2 +- .../PDF/Views/PDFReaderViewController.swift | 47 ++++++++++++------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Zotero/Models/FeatureGates.swift b/Zotero/Models/FeatureGates.swift index 32d87c50d..5e9b01037 100644 --- a/Zotero/Models/FeatureGates.swift +++ b/Zotero/Models/FeatureGates.swift @@ -20,7 +20,7 @@ struct FeatureGates: OptionSet { static let speech = FeatureGates(rawValue: 1 << 4) static var enabled: FeatureGates { - var gates: FeatureGates = [.speech] + var gates: FeatureGates = [] #if FEATURE_GATE_ALL gates.insert(.multipleOpenItems) diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index 2044aa74b..fa26df441 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -62,7 +62,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { } } private var previousTraitCollection: UITraitCollection? - private var accessibilityHandler: AccessibilityViewHandler! + private var accessibilityHandler: AccessibilityViewHandler? var isSidebarVisible: Bool { return sidebarControllerLeft?.constant == 0 } var isToolbarVisible: Bool { return toolbarState.visible } var isDocumentLocked: Bool { return viewModel.state.document.isLocked } @@ -208,15 +208,17 @@ class PDFReaderViewController: UIViewController, ReaderViewController { viewModel.process(action: .changeIdleTimerDisabled(true)) view.backgroundColor = .systemGray6 setupViews() - accessibilityHandler = AccessibilityViewHandler( - key: viewModel.state.key, - libraryId: viewModel.state.library.identifier, - viewController: self, - documentContainer: documentController!.view, - delegate: self, - dbStorage: viewModel.handler.dbStorage - ) - accessibilityHandler.delegate = self + if FeatureGates.enabled.contains(.speech) { + accessibilityHandler = AccessibilityViewHandler( + key: viewModel.state.key, + libraryId: viewModel.state.library.identifier, + viewController: self, + documentContainer: documentController!.view, + delegate: self, + dbStorage: viewModel.handler.dbStorage + ) + accessibilityHandler?.delegate = self + } setupObserving() if !viewModel.state.document.isLocked, let documentController { @@ -332,8 +334,21 @@ class PDFReaderViewController: UIViewController, ReaderViewController { closeButton.accessibilityLabel = L10n.close closeButton.rx.tap.subscribe(onNext: { [weak self] _ in self?.close() }).disposed(by: disposeBag) - let accessibilityButton = accessibilityHandler.createAccessibilityButton(isSelected: false, isFilled: false, isEnabled: !viewModel.state.document.isLocked) - + let accessibilityButton: UIBarButtonItem + if FeatureGates.enabled.contains(.speech), let accessibilityHandler { + accessibilityButton = accessibilityHandler.createAccessibilityButton(isSelected: false, isFilled: false, isEnabled: !viewModel.state.document.isLocked) + } else { + accessibilityButton = UIBarButtonItem(image: Asset.Images.pdfRawReader.image, style: .plain, target: nil, action: nil) + accessibilityButton.isEnabled = !viewModel.state.document.isLocked + accessibilityButton.accessibilityLabel = L10n.Accessibility.showReader + accessibilityButton.title = L10n.Accessibility.showReader + accessibilityButton.rx.tap + .subscribe(onNext: { [weak self] _ in + guard let self else { return } + coordinatorDelegate?.showReader(document: viewModel.state.document, userInterfaceStyle: viewModel.state.settings.appearanceMode.userInterfaceStyle) + }) + .disposed(by: disposeBag) + } navigationItem.leftBarButtonItems = [closeButton, sidebarButton, accessibilityButton] navigationItem.rightBarButtonItems = createRightBarButtonItems() } @@ -404,7 +419,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) updateUserInterfaceStyleIfNeeded(previousTraitCollection: previousTraitCollection) - accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: isNavigationBarHidden) + accessibilityHandler?.accessibilityControlsShouldChange(isNavbarHidden: isNavigationBarHidden) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -749,9 +764,9 @@ extension PDFReaderViewController: AnnotationToolbarHandlerDelegate { func annotationToolbarWillChange(state: AnnotationToolbarHandler.State, statusBarVisible: Bool) { if state.visible && state.position == .pinned { - accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: true) + accessibilityHandler?.accessibilityControlsShouldChange(isNavbarHidden: true) } else { - accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: !statusBarVisible) + accessibilityHandler?.accessibilityControlsShouldChange(isNavbarHidden: !statusBarVisible) } } @@ -912,7 +927,7 @@ extension PDFReaderViewController: PDFDocumentDelegate { intraDocumentNavigationHandler?.interfaceIsVisible = !isHidden annotationToolbarHandler?.interfaceVisibilityDidChange() if shouldChangeNavigationBarVisibility { - accessibilityHandler.accessibilityControlsShouldChange(isNavbarHidden: isHidden) + accessibilityHandler?.accessibilityControlsShouldChange(isNavbarHidden: isHidden) } UIView.animate(withDuration: 0.15, animations: { [weak self] in From cff7131ea15e44d3311cd06da8eb1dcacced866c Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 24 Dec 2025 19:59:32 +0200 Subject: [PATCH 45/75] Update SPM dependencies --- Zotero.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/swiftpm/Package.resolved | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 5305d7ef1..c485a336b 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -7002,7 +7002,7 @@ repositoryURL = "https://github.com/Alamofire/Alamofire"; requirement = { kind = exactVersion; - version = 5.10.1; + version = 5.11.0; }; }; B356A367252490DB003F1943 /* XCRemoteSwiftPackageReference "keychain-swift" */ = { @@ -7042,7 +7042,7 @@ repositoryURL = "https://github.com/Quick/Nimble"; requirement = { kind = exactVersion; - version = 13.8.0; + version = 14.0.0; }; }; B356A38E2524A6BA003F1943 /* XCRemoteSwiftPackageReference "Quick" */ = { @@ -7090,7 +7090,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 26.2.0; + version = 26.3.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 3c1794c8e..163f6bb70 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Alamofire/Alamofire", "state" : { - "revision" : "e16d3481f5ed35f0472cb93350085853d754913f", - "version" : "5.10.1" + "revision" : "7be73f6c2b5cd90e40798b06ebd5da8f9f79cf88", + "version" : "5.11.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Quick/Nimble", "state" : { - "revision" : "cc945f7bdf3b485adedc315e18685c065059b4ca", - "version" : "13.8.0" + "revision" : "035b88ad6ae8035f5ce2b50b0a6d69c3b16d2120", + "version" : "14.0.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "3300eced9885b3c72176d1bbf600ce87c33ec881", - "version" : "26.2.0" + "revision" : "e7ed0f61825156153c493e3be530f75f70664b93", + "version" : "26.3.0" } }, { From 743e3fc8037384c3a88b08eedb283233f8ad6006 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 24 Dec 2025 20:50:40 +0200 Subject: [PATCH 46/75] Fix build bug --- Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift index ff5545aef..ec35cedeb 100644 --- a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift @@ -43,6 +43,8 @@ class BaseItemsViewController: UIViewController { disposeBag = DisposeBag() #if DEBUG debugReaderQueue = DispatchQueue(label: "org.zotero.DebugReaderQueue", qos: .userInteractive) + #else + debugReaderQueue = nil #endif super.init(nibName: nil, bundle: nil) } From 894d5cdaf99a081ff93b6ec757fe516e872060df Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 29 Dec 2025 10:56:53 +0200 Subject: [PATCH 47/75] Add ePub in allowed attachment picker types --- Zotero/Scenes/Detail/DetailCoordinator.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 944d8507b..cd186fa69 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -818,7 +818,11 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { extension DetailCoordinator: DetailItemDetailCoordinatorDelegate { func showAttachmentPicker(save: @escaping ([URL]) -> Void) { guard let navigationController else { return } - let controller = DocumentPickerViewController(forOpeningContentTypes: [.pdf, .png, .jpeg], asCopy: true) + var contentTypes: [UTType] = [.pdf, .png, .jpeg] + if FeatureGates.enabled.contains(.htmlEpubReader) { + contentTypes.append(.epub) + } + let controller = DocumentPickerViewController(forOpeningContentTypes: contentTypes, asCopy: true) controller.popoverPresentationController?.sourceItem = navigationController.visibleViewController?.view controller.observable .observe(on: MainScheduler.instance) From d523083a47f776e05764d54939aabd7c918120c0 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 29 Dec 2025 15:15:16 +0200 Subject: [PATCH 48/75] Fix regression --- Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift index 7e2d4ca9a..49bf6cb3b 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift @@ -377,7 +377,7 @@ final class ItemsViewController: BaseItemsViewController { let frozenResults = results.freeze() let correctedModifications = Database.correctedModifications(from: modifications, insertions: insertions, deletions: deletions) viewModel.process(action: .updateKeys(items: frozenResults, deletions: deletions, insertions: insertions, modifications: correctedModifications)) - dataSource.apply(snapshot: frozenResults, modifications: correctedModifications, insertions: insertions, deletions: deletions) { [weak self] in + dataSource.apply(snapshot: frozenResults, modifications: modifications, insertions: insertions, deletions: deletions) { [weak self] in guard let self else { return } updateTagFilter(filters: viewModel.state.filters, collectionId: collection.identifier, libraryId: library.identifier) } From d9ea5ba0c67f7ad692a3eea152f66e2e23bc358f Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 29 Dec 2025 16:26:49 +0200 Subject: [PATCH 49/75] Move zero case for items.collections_selected to a separate string --- Zotero/Assets/en.lproj/Localizable.strings | 1 + Zotero/Assets/en.lproj/Localizable.stringsdict | 2 -- .../General/Views/CollectionsPickerViewController.swift | 6 +++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 6c130826b..89d5c2e48 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -149,6 +149,7 @@ "items.creator_summary.and" = "%@ and %@"; "items.creator_summary.etal" = "%@ et al."; "items.retrieving_metadata" = "Retrieving Metadata"; +"items.collections_select_prompt" = "Select a Collection"; "lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; diff --git a/Zotero/Assets/en.lproj/Localizable.stringsdict b/Zotero/Assets/en.lproj/Localizable.stringsdict index 017ce0406..af4feaa6f 100644 --- a/Zotero/Assets/en.lproj/Localizable.stringsdict +++ b/Zotero/Assets/en.lproj/Localizable.stringsdict @@ -11,8 +11,6 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d - zero - Select a Collection one 1 Collection Selected other diff --git a/Zotero/Scenes/General/Views/CollectionsPickerViewController.swift b/Zotero/Scenes/General/Views/CollectionsPickerViewController.swift index 06fd25661..f1a810d6d 100644 --- a/Zotero/Scenes/General/Views/CollectionsPickerViewController.swift +++ b/Zotero/Scenes/General/Views/CollectionsPickerViewController.swift @@ -125,7 +125,11 @@ class CollectionsPickerViewController: UICollectionViewController { } private func updateTitle(with selectedCount: Int) { - title = L10n.Items.collectionsSelected(selectedCount) + if selectedCount == 0 { + title = L10n.Items.collectionsSelectPrompt + } else { + title = L10n.Items.collectionsSelected(selectedCount) + } } private func updateDataSource(with state: CollectionsPickerState, animated: Bool) { From d96567f247cee7042841b3b61276d92ed5b27d6a Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 29 Dec 2025 17:35:53 +0200 Subject: [PATCH 50/75] Update github actions (#1223) --- .github/workflows/run-tests.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 3e6a5946e..b841d2ff2 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -11,16 +11,16 @@ on: jobs: tests: name: Run Xcode Tests - runs-on: macos-15 + runs-on: macos-26 strategy: matrix: - xcode: ["16.3"] - ios_version: ["18.4"] - device_name: ["iPhone 16"] + xcode: ["26.2"] + ios_version: ["26.2"] + device_name: ["iPhone 17"] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: submodules: recursive @@ -41,7 +41,7 @@ jobs: xcode-version: ${{ matrix.xcode }} - name: Clean & Build & Test - uses: sersoft-gmbh/xcodebuild-action@v3.1 + uses: sersoft-gmbh/xcodebuild-action@v4.0 with: project: Zotero.xcodeproj scheme: Zotero From b02228e7b2286e61c04a77d63b088274de0f7419 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 29 Dec 2025 17:54:34 +0200 Subject: [PATCH 51/75] Allow any type in attachment picker --- Zotero/Scenes/Detail/DetailCoordinator.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index cd186fa69..46e83eec9 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -818,11 +818,7 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { extension DetailCoordinator: DetailItemDetailCoordinatorDelegate { func showAttachmentPicker(save: @escaping ([URL]) -> Void) { guard let navigationController else { return } - var contentTypes: [UTType] = [.pdf, .png, .jpeg] - if FeatureGates.enabled.contains(.htmlEpubReader) { - contentTypes.append(.epub) - } - let controller = DocumentPickerViewController(forOpeningContentTypes: contentTypes, asCopy: true) + let controller = DocumentPickerViewController(forOpeningContentTypes: [.item], asCopy: true) controller.popoverPresentationController?.sourceItem = navigationController.visibleViewController?.view controller.observable .observe(on: MainScheduler.instance) From c8f9f1b873a9caac1ed6a21a87704ab499fed9a7 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Mon, 5 Jan 2026 11:32:48 +0200 Subject: [PATCH 52/75] Fix dynamic type font size (#1225) --- Zotero/Extensions/UIFont+Extensions.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Zotero/Extensions/UIFont+Extensions.swift b/Zotero/Extensions/UIFont+Extensions.swift index ade87fe11..e653d3a9d 100644 --- a/Zotero/Extensions/UIFont+Extensions.swift +++ b/Zotero/Extensions/UIFont+Extensions.swift @@ -9,10 +9,14 @@ import UIKit extension UIFont { - static func preferredFont(for style: TextStyle, weight: Weight) -> UIFont { + static func preferredFont(for style: UIFont.TextStyle, weight: UIFont.Weight) -> UIFont { + // Get the font descriptor for the default Dynamic Type setting value, which is large. + let traits = UITraitCollection(preferredContentSizeCategory: .large) + let fontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: style, compatibleWith: traits) + // Then create the system font with the desired weight at that default size. + let font = UIFont.systemFont(ofSize: fontDescriptor.pointSize, weight: weight) + // Finally apply metrics so it scales according to the current Dynamic Type setting. let metrics = UIFontMetrics(forTextStyle: style) - let desc = UIFontDescriptor.preferredFontDescriptor(withTextStyle: style) - let font = UIFont.systemFont(ofSize: desc.pointSize, weight: weight) return metrics.scaledFont(for: font) } From f849e44e4063a8495784ad270641aadb67981a46 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Thu, 8 Jan 2026 03:39:34 -0500 Subject: [PATCH 53/75] Add locales from Transifex (#1226) --- .tx/config | 31 + Zotero.xcodeproj/project.pbxproj | 395 ++++++++++++ Zotero/Assets/af.lproj/InfoPList.strings | 9 + Zotero/Assets/af.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/af.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/am.lproj/InfoPList.strings | 9 + Zotero/Assets/am.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/am.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ar.lproj/InfoPList.strings | 9 + Zotero/Assets/ar.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ar.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ast.lproj/InfoPList.strings | 9 + Zotero/Assets/ast.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ast.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/bg.lproj/InfoPList.strings | 9 + Zotero/Assets/bg.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/bg.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/bn.lproj/InfoPList.strings | 9 + Zotero/Assets/bn.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/bn.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/br.lproj/InfoPList.strings | 9 + Zotero/Assets/br.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/br.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ca.lproj/InfoPList.strings | 9 + Zotero/Assets/ca.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ca.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/cs.lproj/InfoPList.strings | 9 + Zotero/Assets/cs.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/cs.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/cy.lproj/InfoPList.strings | 9 + Zotero/Assets/cy.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/cy.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/da.lproj/InfoPList.strings | 9 + Zotero/Assets/da.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/da.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/de.lproj/InfoPList.strings | 9 + Zotero/Assets/de.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/de.lproj/Localizable.stringsdict | 92 +++ Zotero/Assets/el.lproj/InfoPList.strings | 9 + Zotero/Assets/el.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/el.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/en-GB.lproj/InfoPList.strings | 9 + Zotero/Assets/en-GB.lproj/Localizable.strings | 592 ++++++++++++++++++ .../en-GB.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/es-AR.lproj/InfoPList.strings | 9 + Zotero/Assets/es-AR.lproj/Localizable.strings | 592 ++++++++++++++++++ .../es-AR.lproj/Localizable.stringsdict | 239 +++++++ Zotero/Assets/es.lproj/InfoPList.strings | 9 + Zotero/Assets/es.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/es.lproj/Localizable.stringsdict | 239 +++++++ Zotero/Assets/et.lproj/InfoPList.strings | 9 + Zotero/Assets/et.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/et.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/eu.lproj/InfoPList.strings | 9 + Zotero/Assets/eu.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/eu.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/fa.lproj/InfoPList.strings | 9 + Zotero/Assets/fa.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/fa.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/fi.lproj/InfoPList.strings | 9 + Zotero/Assets/fi.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/fi.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/fr.lproj/InfoPList.strings | 9 + Zotero/Assets/fr.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/fr.lproj/Localizable.stringsdict | 239 +++++++ Zotero/Assets/gl.lproj/InfoPList.strings | 9 + Zotero/Assets/gl.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/gl.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/he.lproj/InfoPList.strings | 9 + Zotero/Assets/he.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/he.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/hr.lproj/InfoPList.strings | 9 + Zotero/Assets/hr.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/hr.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/hu.lproj/InfoPList.strings | 9 + Zotero/Assets/hu.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/hu.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/hy.lproj/InfoPList.strings | 9 + Zotero/Assets/hy.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/hy.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/id.lproj/InfoPList.strings | 9 + Zotero/Assets/id.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/id.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ig.lproj/InfoPList.strings | 9 + Zotero/Assets/ig.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ig.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/is.lproj/InfoPList.strings | 9 + Zotero/Assets/is.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/is.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/it.lproj/InfoPList.strings | 9 + Zotero/Assets/it.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/it.lproj/Localizable.stringsdict | 239 +++++++ Zotero/Assets/ja.lproj/InfoPList.strings | 9 + Zotero/Assets/ja.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ja.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/jv.lproj/InfoPList.strings | 9 + Zotero/Assets/jv.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/jv.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ka.lproj/InfoPList.strings | 9 + Zotero/Assets/ka.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ka.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/kk.lproj/InfoPList.strings | 9 + Zotero/Assets/kk.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/kk.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/km.lproj/InfoPList.strings | 9 + Zotero/Assets/km.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/km.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/kn.lproj/InfoPList.strings | 9 + Zotero/Assets/kn.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/kn.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ko.lproj/InfoPList.strings | 9 + Zotero/Assets/ko.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ko.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/lt.lproj/InfoPList.strings | 9 + Zotero/Assets/lt.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/lt.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/mk.lproj/InfoPList.strings | 9 + Zotero/Assets/mk.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/mk.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/mn.lproj/InfoPList.strings | 9 + Zotero/Assets/mn.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/mn.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/nb-NO.lproj/InfoPList.strings | 9 + Zotero/Assets/nb-NO.lproj/Localizable.strings | 592 ++++++++++++++++++ .../nb-NO.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/nl.lproj/InfoPList.strings | 9 + Zotero/Assets/nl.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/nl.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/nn-NO.lproj/InfoPList.strings | 9 + Zotero/Assets/nn-NO.lproj/Localizable.strings | 592 ++++++++++++++++++ .../nn-NO.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/oc.lproj/InfoPList.strings | 9 + Zotero/Assets/oc.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/oc.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/pl.lproj/InfoPList.strings | 9 + Zotero/Assets/pl.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/pl.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/pt-BR.lproj/InfoPList.strings | 9 + Zotero/Assets/pt-BR.lproj/Localizable.strings | 592 ++++++++++++++++++ .../pt-BR.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/pt-PT.lproj/InfoPList.strings | 9 + Zotero/Assets/pt-PT.lproj/Localizable.strings | 592 ++++++++++++++++++ .../pt-PT.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ro.lproj/InfoPList.strings | 9 + Zotero/Assets/ro.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ro.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ru.lproj/InfoPList.strings | 9 + Zotero/Assets/ru.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ru.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/sk.lproj/InfoPList.strings | 9 + Zotero/Assets/sk.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/sk.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/sl.lproj/InfoPList.strings | 9 + Zotero/Assets/sl.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/sl.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/sq.lproj/InfoPList.strings | 9 + Zotero/Assets/sq.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/sq.lproj/Localizable.stringsdict | 213 +++++++ Zotero/Assets/sr.lproj/InfoPList.strings | 9 + Zotero/Assets/sr.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/sr.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/sv.lproj/InfoPList.strings | 9 + Zotero/Assets/sv.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/sv.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/ta.lproj/InfoPList.strings | 9 + Zotero/Assets/ta.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/ta.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/th.lproj/InfoPList.strings | 9 + Zotero/Assets/th.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/th.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/tr.lproj/InfoPList.strings | 9 + Zotero/Assets/tr.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/tr.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/uk.lproj/InfoPList.strings | 9 + Zotero/Assets/uk.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/uk.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/vi.lproj/InfoPList.strings | 9 + Zotero/Assets/vi.lproj/Localizable.strings | 592 ++++++++++++++++++ .../Assets/vi.lproj/Localizable.stringsdict | 70 +++ .../Assets/yue-Hans.lproj/InfoPList.strings | 9 + .../Assets/yue-Hans.lproj/Localizable.strings | 592 ++++++++++++++++++ .../yue-Hans.lproj/Localizable.stringsdict | 70 +++ Zotero/Assets/zh-Hans.lproj/InfoPList.strings | 9 + .../Assets/zh-Hans.lproj/Localizable.strings | 592 ++++++++++++++++++ .../zh-Hans.lproj/Localizable.stringsdict | 178 ++++++ Zotero/Assets/zh-Hant.lproj/InfoPList.strings | 9 + .../Assets/zh-Hant.lproj/Localizable.strings | 592 ++++++++++++++++++ .../zh-Hant.lproj/Localizable.stringsdict | 70 +++ 188 files changed, 42977 insertions(+) create mode 100755 .tx/config create mode 100644 Zotero/Assets/af.lproj/InfoPList.strings create mode 100644 Zotero/Assets/af.lproj/Localizable.strings create mode 100644 Zotero/Assets/af.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/am.lproj/InfoPList.strings create mode 100644 Zotero/Assets/am.lproj/Localizable.strings create mode 100644 Zotero/Assets/am.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ar.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ar.lproj/Localizable.strings create mode 100644 Zotero/Assets/ar.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ast.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ast.lproj/Localizable.strings create mode 100644 Zotero/Assets/ast.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/bg.lproj/InfoPList.strings create mode 100644 Zotero/Assets/bg.lproj/Localizable.strings create mode 100644 Zotero/Assets/bg.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/bn.lproj/InfoPList.strings create mode 100644 Zotero/Assets/bn.lproj/Localizable.strings create mode 100644 Zotero/Assets/bn.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/br.lproj/InfoPList.strings create mode 100644 Zotero/Assets/br.lproj/Localizable.strings create mode 100644 Zotero/Assets/br.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ca.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ca.lproj/Localizable.strings create mode 100644 Zotero/Assets/ca.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/cs.lproj/InfoPList.strings create mode 100644 Zotero/Assets/cs.lproj/Localizable.strings create mode 100644 Zotero/Assets/cs.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/cy.lproj/InfoPList.strings create mode 100644 Zotero/Assets/cy.lproj/Localizable.strings create mode 100644 Zotero/Assets/cy.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/da.lproj/InfoPList.strings create mode 100644 Zotero/Assets/da.lproj/Localizable.strings create mode 100644 Zotero/Assets/da.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/de.lproj/InfoPList.strings create mode 100644 Zotero/Assets/de.lproj/Localizable.strings create mode 100644 Zotero/Assets/de.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/el.lproj/InfoPList.strings create mode 100644 Zotero/Assets/el.lproj/Localizable.strings create mode 100644 Zotero/Assets/el.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/en-GB.lproj/InfoPList.strings create mode 100644 Zotero/Assets/en-GB.lproj/Localizable.strings create mode 100644 Zotero/Assets/en-GB.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/es-AR.lproj/InfoPList.strings create mode 100644 Zotero/Assets/es-AR.lproj/Localizable.strings create mode 100644 Zotero/Assets/es-AR.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/es.lproj/InfoPList.strings create mode 100644 Zotero/Assets/es.lproj/Localizable.strings create mode 100644 Zotero/Assets/es.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/et.lproj/InfoPList.strings create mode 100644 Zotero/Assets/et.lproj/Localizable.strings create mode 100644 Zotero/Assets/et.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/eu.lproj/InfoPList.strings create mode 100644 Zotero/Assets/eu.lproj/Localizable.strings create mode 100644 Zotero/Assets/eu.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/fa.lproj/InfoPList.strings create mode 100644 Zotero/Assets/fa.lproj/Localizable.strings create mode 100644 Zotero/Assets/fa.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/fi.lproj/InfoPList.strings create mode 100644 Zotero/Assets/fi.lproj/Localizable.strings create mode 100644 Zotero/Assets/fi.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/fr.lproj/InfoPList.strings create mode 100644 Zotero/Assets/fr.lproj/Localizable.strings create mode 100644 Zotero/Assets/fr.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/gl.lproj/InfoPList.strings create mode 100644 Zotero/Assets/gl.lproj/Localizable.strings create mode 100644 Zotero/Assets/gl.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/he.lproj/InfoPList.strings create mode 100644 Zotero/Assets/he.lproj/Localizable.strings create mode 100644 Zotero/Assets/he.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/hr.lproj/InfoPList.strings create mode 100644 Zotero/Assets/hr.lproj/Localizable.strings create mode 100644 Zotero/Assets/hr.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/hu.lproj/InfoPList.strings create mode 100644 Zotero/Assets/hu.lproj/Localizable.strings create mode 100644 Zotero/Assets/hu.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/hy.lproj/InfoPList.strings create mode 100644 Zotero/Assets/hy.lproj/Localizable.strings create mode 100644 Zotero/Assets/hy.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/id.lproj/InfoPList.strings create mode 100644 Zotero/Assets/id.lproj/Localizable.strings create mode 100644 Zotero/Assets/id.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ig.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ig.lproj/Localizable.strings create mode 100644 Zotero/Assets/ig.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/is.lproj/InfoPList.strings create mode 100644 Zotero/Assets/is.lproj/Localizable.strings create mode 100644 Zotero/Assets/is.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/it.lproj/InfoPList.strings create mode 100644 Zotero/Assets/it.lproj/Localizable.strings create mode 100644 Zotero/Assets/it.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ja.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ja.lproj/Localizable.strings create mode 100644 Zotero/Assets/ja.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/jv.lproj/InfoPList.strings create mode 100644 Zotero/Assets/jv.lproj/Localizable.strings create mode 100644 Zotero/Assets/jv.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ka.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ka.lproj/Localizable.strings create mode 100644 Zotero/Assets/ka.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/kk.lproj/InfoPList.strings create mode 100644 Zotero/Assets/kk.lproj/Localizable.strings create mode 100644 Zotero/Assets/kk.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/km.lproj/InfoPList.strings create mode 100644 Zotero/Assets/km.lproj/Localizable.strings create mode 100644 Zotero/Assets/km.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/kn.lproj/InfoPList.strings create mode 100644 Zotero/Assets/kn.lproj/Localizable.strings create mode 100644 Zotero/Assets/kn.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ko.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ko.lproj/Localizable.strings create mode 100644 Zotero/Assets/ko.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/lt.lproj/InfoPList.strings create mode 100644 Zotero/Assets/lt.lproj/Localizable.strings create mode 100644 Zotero/Assets/lt.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/mk.lproj/InfoPList.strings create mode 100644 Zotero/Assets/mk.lproj/Localizable.strings create mode 100644 Zotero/Assets/mk.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/mn.lproj/InfoPList.strings create mode 100644 Zotero/Assets/mn.lproj/Localizable.strings create mode 100644 Zotero/Assets/mn.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/nb-NO.lproj/InfoPList.strings create mode 100644 Zotero/Assets/nb-NO.lproj/Localizable.strings create mode 100644 Zotero/Assets/nb-NO.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/nl.lproj/InfoPList.strings create mode 100644 Zotero/Assets/nl.lproj/Localizable.strings create mode 100644 Zotero/Assets/nl.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/nn-NO.lproj/InfoPList.strings create mode 100644 Zotero/Assets/nn-NO.lproj/Localizable.strings create mode 100644 Zotero/Assets/nn-NO.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/oc.lproj/InfoPList.strings create mode 100644 Zotero/Assets/oc.lproj/Localizable.strings create mode 100644 Zotero/Assets/oc.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/pl.lproj/InfoPList.strings create mode 100644 Zotero/Assets/pl.lproj/Localizable.strings create mode 100644 Zotero/Assets/pl.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/pt-BR.lproj/InfoPList.strings create mode 100644 Zotero/Assets/pt-BR.lproj/Localizable.strings create mode 100644 Zotero/Assets/pt-BR.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/pt-PT.lproj/InfoPList.strings create mode 100644 Zotero/Assets/pt-PT.lproj/Localizable.strings create mode 100644 Zotero/Assets/pt-PT.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ro.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ro.lproj/Localizable.strings create mode 100644 Zotero/Assets/ro.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ru.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ru.lproj/Localizable.strings create mode 100644 Zotero/Assets/ru.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/sk.lproj/InfoPList.strings create mode 100644 Zotero/Assets/sk.lproj/Localizable.strings create mode 100644 Zotero/Assets/sk.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/sl.lproj/InfoPList.strings create mode 100644 Zotero/Assets/sl.lproj/Localizable.strings create mode 100644 Zotero/Assets/sl.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/sq.lproj/InfoPList.strings create mode 100644 Zotero/Assets/sq.lproj/Localizable.strings create mode 100644 Zotero/Assets/sq.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/sr.lproj/InfoPList.strings create mode 100644 Zotero/Assets/sr.lproj/Localizable.strings create mode 100644 Zotero/Assets/sr.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/sv.lproj/InfoPList.strings create mode 100644 Zotero/Assets/sv.lproj/Localizable.strings create mode 100644 Zotero/Assets/sv.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/ta.lproj/InfoPList.strings create mode 100644 Zotero/Assets/ta.lproj/Localizable.strings create mode 100644 Zotero/Assets/ta.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/th.lproj/InfoPList.strings create mode 100644 Zotero/Assets/th.lproj/Localizable.strings create mode 100644 Zotero/Assets/th.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/tr.lproj/InfoPList.strings create mode 100644 Zotero/Assets/tr.lproj/Localizable.strings create mode 100644 Zotero/Assets/tr.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/uk.lproj/InfoPList.strings create mode 100644 Zotero/Assets/uk.lproj/Localizable.strings create mode 100644 Zotero/Assets/uk.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/vi.lproj/InfoPList.strings create mode 100644 Zotero/Assets/vi.lproj/Localizable.strings create mode 100644 Zotero/Assets/vi.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/yue-Hans.lproj/InfoPList.strings create mode 100644 Zotero/Assets/yue-Hans.lproj/Localizable.strings create mode 100644 Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/zh-Hans.lproj/InfoPList.strings create mode 100644 Zotero/Assets/zh-Hans.lproj/Localizable.strings create mode 100644 Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict create mode 100644 Zotero/Assets/zh-Hant.lproj/InfoPList.strings create mode 100644 Zotero/Assets/zh-Hant.lproj/Localizable.strings create mode 100644 Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict diff --git a/.tx/config b/.tx/config new file mode 100755 index 000000000..6c09cf68a --- /dev/null +++ b/.tx/config @@ -0,0 +1,31 @@ +[main] +host = https://app.transifex.com +lang_map = af_ZA: af, am_ET: am, bg_BG: bg, bn_BD: bn, ca: ca, cs_CZ: cs, da_DK: da, el_GR: el, en_GB: en-GB, es_AR: es-AR, es_ES: es, et_EE: et, eu_ES: eu, fi_FI: fi, fr_FR: fr, gl_ES: gl, he_IL: he, hr_HR: hr, hu_HU: hu, id_ID: id, is_IS: is, it_IT: it, ja_JP: ja, kn_IN: kn, ko_KR: ko, lt_LT: lt, mn_MN: mn, nb_NO: nb-NO, nl_NL: nl, nn_NO: nn-NO, pl_PL: pl, pt_BR: pt-BR, pt_PT: pt-PT, ro_RO: ro, ru_RU: ru, sk_SK: sk, sl_SI: sl, sr_RS: sr, sv_SE: sv, th_TH: th, tr_TR: tr, uk_UA: uk, vi_VN: vi, yue_CN: yue-Hans, zh_CN: zh-Hans, zh_TW: zh-Hant + +[o:zotero:p:zotero-mobile:r:infopliststrings] +file_filter = Zotero/Assets/.lproj/InfoPList.strings +source_file = Zotero/Assets/en.lproj/InfoPList.strings +type = STRINGS_UTF8 +minimum_perc = 0 +resource_name = InfoPlist.strings +replace_edited_strings = false +keep_translations = false + +[o:zotero:p:zotero-mobile:r:localizablestrings] +file_filter = ./Zotero/Assets/.lproj/Localizable.strings +source_file = ./Zotero/Assets/en.lproj/Localizable.strings +type = STRINGS_UTF8 +minimum_perc = 0 +resource_name = Localizable.strings +replace_edited_strings = false +keep_translations = false + +[o:zotero:p:zotero-mobile:r:localizablestringsdict] +file_filter = ./Zotero/Assets/.lproj/Localizable.stringsdict +source_file = ./Zotero/Assets/en.lproj/Localizable.stringsdict +type = STRINGSDICT +minimum_perc = 0 +resource_name = Localizable.stringsdict +replace_edited_strings = false +keep_translations = false + diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index c485a336b..60377118d 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -1957,6 +1957,171 @@ B3866A592417C1C7006693C4 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = ""; }; B3868536270D90640068A022 /* RawDataEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawDataEncoding.swift; sourceTree = ""; }; B386853F270DC3AA0068A022 /* WebDavScheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebDavScheme.swift; sourceTree = ""; }; + B3877D282F0F9B4200D25D4C /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D292F0F9B4200D25D4C /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; + B3877D2A2F0F9B4200D25D4C /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ar; path = ar.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D2B2F0F9BDB00D25D4C /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = af.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D2C2F0F9BDC00D25D4C /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = af.lproj/Localizable.strings; sourceTree = ""; }; + B3877D2D2F0F9BDC00D25D4C /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = af; path = af.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D2E2F0F9BFC00D25D4C /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = am; path = am.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D2F2F0F9BFC00D25D4C /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = am; path = am.lproj/Localizable.strings; sourceTree = ""; }; + B3877D302F0F9BFC00D25D4C /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = am; path = am.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D312F0F9C2000D25D4C /* ast */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ast; path = ast.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D322F0F9C2100D25D4C /* ast */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ast; path = ast.lproj/Localizable.strings; sourceTree = ""; }; + B3877D332F0F9C2100D25D4C /* ast */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ast; path = ast.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D342F0F9C4500D25D4C /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D352F0F9C4500D25D4C /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; + B3877D362F0F9C4500D25D4C /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = bg; path = bg.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D372F0F9C5D00D25D4C /* bn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bn; path = bn.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D382F0F9C5D00D25D4C /* bn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bn; path = bn.lproj/Localizable.strings; sourceTree = ""; }; + B3877D392F0F9C5D00D25D4C /* bn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = bn; path = bn.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D3A2F0F9C8600D25D4C /* br */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = br; path = br.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D3B2F0F9C8600D25D4C /* br */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = br; path = br.lproj/Localizable.strings; sourceTree = ""; }; + B3877D3C2F0F9C8600D25D4C /* br */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = br; path = br.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D3D2F0F9C9100D25D4C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D3E2F0F9C9100D25D4C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; + B3877D3F2F0F9C9100D25D4C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ca; path = ca.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D402F0F9C9B00D25D4C /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D412F0F9C9B00D25D4C /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + B3877D422F0F9C9B00D25D4C /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = cs; path = cs.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D432F0F9CFE00D25D4C /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D442F0F9CFE00D25D4C /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cy; path = cy.lproj/Localizable.strings; sourceTree = ""; }; + B3877D452F0F9CFE00D25D4C /* cy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = cy; path = cy.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D462F0F9D0900D25D4C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D472F0F9D0900D25D4C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; + B3877D482F0F9D0A00D25D4C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = da; path = da.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D492F0F9D1900D25D4C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D4A2F0F9D1900D25D4C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + B3877D4B2F0F9D1900D25D4C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = de; path = de.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D4C2F0F9D4200D25D4C /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D4D2F0F9D4200D25D4C /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; + B3877D4E2F0F9D4200D25D4C /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = el; path = el.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D4F2F0F9D4F00D25D4C /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877D502F0F9D5000D25D4C /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; + B3877D512F0F9D5000D25D4C /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "en-GB"; path = "en-GB.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877D522F0F9D6D00D25D4C /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877D532F0F9D6D00D25D4C /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/Localizable.strings"; sourceTree = ""; }; + B3877D542F0F9D8300D25D4C /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D552F0F9D8300D25D4C /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + B3877D562F0F9DB200D25D4C /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D572F0F9DB200D25D4C /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; + B3877D582F0F9DB200D25D4C /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = et; path = et.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D592F0F9DD200D25D4C /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D5A2F0F9DD200D25D4C /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Localizable.strings; sourceTree = ""; }; + B3877D5B2F0F9DD300D25D4C /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = eu; path = eu.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D5C2F0F9E0500D25D4C /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D5D2F0F9E0500D25D4C /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = ""; }; + B3877D5E2F0F9E1400D25D4C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D5F2F0F9E1600D25D4C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fi; path = fi.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D602F0F9E2000D25D4C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D612F0F9E2000D25D4C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + B3877D622F0F9E2000D25D4C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fr; path = fr.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D632F0F9E3F00D25D4C /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Localizable.strings; sourceTree = ""; }; + B3877D642F0F9E3F00D25D4C /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = gl; path = gl.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D652F0F9E5300D25D4C /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D662F0F9E5300D25D4C /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; }; + B3877D672F0F9E5300D25D4C /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = he; path = he.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D682F0F9E7000D25D4C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D692F0F9E7000D25D4C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; + B3877D6A2F0F9E7000D25D4C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hr; path = hr.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D6B2F0F9E7B00D25D4C /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D6C2F0F9E7B00D25D4C /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + B3877D6D2F0F9E9400D25D4C /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = hy.lproj/Localizable.strings; sourceTree = ""; }; + B3877D6E2F0F9E9500D25D4C /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hy; path = hy.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D6F2F0F9EB000D25D4C /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D702F0F9EB000D25D4C /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; + B3877D712F0F9EB000D25D4C /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D722F0F9ED000D25D4C /* ig */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ig; path = ig.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D732F0F9ED000D25D4C /* ig */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ig; path = ig.lproj/Localizable.strings; sourceTree = ""; }; + B3877D742F0F9ED000D25D4C /* ig */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ig; path = ig.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D752F0F9EF600D25D4C /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D762F0F9EF600D25D4C /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Localizable.strings; sourceTree = ""; }; + B3877D772F0F9EF600D25D4C /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = is; path = is.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D782F0F9F0D00D25D4C /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D792F0F9F0D00D25D4C /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + B3877D7A2F0F9F0D00D25D4C /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = it; path = it.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D7B2F0F9F2C00D25D4C /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D7C2F0F9F6A00D25D4C /* jv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = jv; path = jv.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D7D2F0F9F6A00D25D4C /* jv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = jv; path = jv.lproj/Localizable.strings; sourceTree = ""; }; + B3877D7E2F0F9F6A00D25D4C /* jv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = jv; path = jv.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D7F2F0F9F8B00D25D4C /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D802F0F9F8B00D25D4C /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Localizable.strings; sourceTree = ""; }; + B3877D812F0F9F8B00D25D4C /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ka; path = ka.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D822F0F9FA800D25D4C /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D832F0F9FA800D25D4C /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/Localizable.strings; sourceTree = ""; }; + B3877D842F0F9FA800D25D4C /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = kk; path = kk.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D852F0F9FE800D25D4C /* km */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = km; path = km.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D862F0F9FE800D25D4C /* km */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = km; path = km.lproj/Localizable.strings; sourceTree = ""; }; + B3877D872F0F9FE800D25D4C /* km */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = km; path = km.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D882F0FA00100D25D4C /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D892F0FA00500D25D4C /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = kn; path = kn.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D8A2F0FA04800D25D4C /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D8B2F0FA04800D25D4C /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + B3877D8C2F0FA04800D25D4C /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = ko.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D8D2F0FA05900D25D4C /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D8E2F0FA05B00D25D4C /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = lt; path = lt.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D8F2F0FA07A00D25D4C /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = mk.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D902F0FA07A00D25D4C /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = mk.lproj/Localizable.strings; sourceTree = ""; }; + B3877D912F0FA07A00D25D4C /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = mk; path = mk.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D922F0FA08F00D25D4C /* mn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mn; path = mn.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D932F0FA08F00D25D4C /* mn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mn; path = mn.lproj/Localizable.strings; sourceTree = ""; }; + B3877D942F0FA08F00D25D4C /* mn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = mn; path = mn.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D952F0FA0B500D25D4C /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877D962F0FA0B500D25D4C /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Localizable.strings"; sourceTree = ""; }; + B3877D972F0FA0B600D25D4C /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "nb-NO"; path = "nb-NO.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877D982F0FA0D700D25D4C /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D992F0FA0D700D25D4C /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + B3877D9A2F0FA0D700D25D4C /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = nl; path = nl.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877D9B2F0FA0EA00D25D4C /* nn-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nn-NO"; path = "nn-NO.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877D9C2F0FA0EA00D25D4C /* nn-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nn-NO"; path = "nn-NO.lproj/Localizable.strings"; sourceTree = ""; }; + B3877D9D2F0FA0EA00D25D4C /* nn-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "nn-NO"; path = "nn-NO.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877D9E2F0FA10700D25D4C /* oc */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = oc; path = oc.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877D9F2F0FA10800D25D4C /* oc */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = oc; path = oc.lproj/Localizable.strings; sourceTree = ""; }; + B3877DA02F0FA10800D25D4C /* oc */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = oc; path = oc.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DA12F0FA12200D25D4C /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DA22F0FA12200D25D4C /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + B3877DA32F0FA12300D25D4C /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = pl; path = pl.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DA42F0FA13800D25D4C /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877DA52F0FA13900D25D4C /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; + B3877DA62F0FA13900D25D4C /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-BR"; path = "pt-BR.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877DA72F0FA14200D25D4C /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877DA82F0FA14200D25D4C /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; + B3877DA92F0FA14200D25D4C /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-PT"; path = "pt-PT.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877DAA2F0FA15300D25D4C /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DAB2F0FA15300D25D4C /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; + B3877DAC2F0FA16300D25D4C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DAD2F0FA16400D25D4C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + B3877DAE2F0FA16400D25D4C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DAF2F0FA17300D25D4C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DB02F0FA17500D25D4C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sk; path = sk.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DB12F0FA18300D25D4C /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DB22F0FA18300D25D4C /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = ""; }; + B3877DB32F0FA18300D25D4C /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sl; path = sl.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DB42F0FA19A00D25D4C /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DB52F0FA19A00D25D4C /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Localizable.strings; sourceTree = ""; }; + B3877DB62F0FA19A00D25D4C /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sq; path = sq.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DB72F0FA1CC00D25D4C /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Localizable.strings; sourceTree = ""; }; + B3877DB82F0FA1FA00D25D4C /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DB92F0FA1FA00D25D4C /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + B3877DBA2F0FA21800D25D4C /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DBB2F0FA21800D25D4C /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/Localizable.strings; sourceTree = ""; }; + B3877DBC2F0FA22700D25D4C /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; }; + B3877DBD2F0FA22700D25D4C /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = th; path = th.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DBE2F0FA23000D25D4C /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DBF2F0FA23300D25D4C /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DC02F0FA23E00D25D4C /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DC12F0FA23E00D25D4C /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + B3877DC22F0FA23E00D25D4C /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = uk; path = uk.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DC32F0FA24900D25D4C /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = ""; }; + B3877DC42F0FA24B00D25D4C /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = vi; path = vi.lproj/Localizable.stringsdict; sourceTree = ""; }; + B3877DC52F0FA26000D25D4C /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877DC62F0FA26100D25D4C /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + B3877DC72F0FA26100D25D4C /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877DC82F0FA26700D25D4C /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = ""; }; + B3877DC92F0FA26700D25D4C /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + B3877DCA2F0FA26700D25D4C /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.stringsdict"; sourceTree = ""; }; + B3877DCB2F0FA28700D25D4C /* yue-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "yue-Hans"; path = "yue-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + B3877DCC2F0FA28700D25D4C /* yue-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "yue-Hans"; path = "yue-Hans.lproj/Localizable.stringsdict"; sourceTree = ""; }; B38B24B826E7664400BDD1BB /* AnnotationToolOptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationToolOptionsViewController.swift; sourceTree = ""; }; B38CD21D241128D4004299EA /* KeysResponseProcessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeysResponseProcessor.swift; sourceTree = ""; }; B390EE2B29B5F419004F979B /* PDFCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFCoordinator.swift; sourceTree = ""; }; @@ -4703,6 +4868,68 @@ knownRegions = ( en, Base, + ar, + af, + am, + ast, + bg, + bn, + br, + ca, + cs, + cy, + da, + de, + el, + "en-GB", + "es-AR", + es, + et, + eu, + fa, + fi, + fr, + gl, + he, + hr, + hu, + hy, + id, + ig, + is, + it, + ja, + jv, + ka, + kk, + km, + kn, + ko, + lt, + mk, + mn, + "nb-NO", + nl, + "nn-NO", + oc, + pl, + "pt-BR", + "pt-PT", + ro, + ru, + sk, + sl, + sq, + sr, + sv, + ta, + th, + tr, + uk, + vi, + "zh-Hans", + "zh-Hant", + "yue-Hans", ); mainGroup = B30D594C2206F60400884C4A; packageReferences = ( @@ -6299,6 +6526,63 @@ isa = PBXVariantGroup; children = ( 613F32782C1086950088EF70 /* en */, + B3877D282F0F9B4200D25D4C /* ar */, + B3877D2B2F0F9BDB00D25D4C /* af */, + B3877D2E2F0F9BFC00D25D4C /* am */, + B3877D312F0F9C2000D25D4C /* ast */, + B3877D342F0F9C4500D25D4C /* bg */, + B3877D372F0F9C5D00D25D4C /* bn */, + B3877D3A2F0F9C8600D25D4C /* br */, + B3877D3D2F0F9C9100D25D4C /* ca */, + B3877D402F0F9C9B00D25D4C /* cs */, + B3877D432F0F9CFE00D25D4C /* cy */, + B3877D462F0F9D0900D25D4C /* da */, + B3877D492F0F9D1900D25D4C /* de */, + B3877D4C2F0F9D4200D25D4C /* el */, + B3877D4F2F0F9D4F00D25D4C /* en-GB */, + B3877D522F0F9D6D00D25D4C /* es-AR */, + B3877D542F0F9D8300D25D4C /* es */, + B3877D562F0F9DB200D25D4C /* et */, + B3877D592F0F9DD200D25D4C /* eu */, + B3877D5C2F0F9E0500D25D4C /* fa */, + B3877D5E2F0F9E1400D25D4C /* fi */, + B3877D602F0F9E2000D25D4C /* fr */, + B3877D652F0F9E5300D25D4C /* he */, + B3877D682F0F9E7000D25D4C /* hr */, + B3877D6B2F0F9E7B00D25D4C /* hu */, + B3877D6F2F0F9EB000D25D4C /* id */, + B3877D722F0F9ED000D25D4C /* ig */, + B3877D752F0F9EF600D25D4C /* is */, + B3877D782F0F9F0D00D25D4C /* it */, + B3877D7B2F0F9F2C00D25D4C /* ja */, + B3877D7C2F0F9F6A00D25D4C /* jv */, + B3877D7F2F0F9F8B00D25D4C /* ka */, + B3877D822F0F9FA800D25D4C /* kk */, + B3877D852F0F9FE800D25D4C /* km */, + B3877D882F0FA00100D25D4C /* kn */, + B3877D8A2F0FA04800D25D4C /* ko */, + B3877D8D2F0FA05900D25D4C /* lt */, + B3877D8F2F0FA07A00D25D4C /* mk */, + B3877D922F0FA08F00D25D4C /* mn */, + B3877D952F0FA0B500D25D4C /* nb-NO */, + B3877D982F0FA0D700D25D4C /* nl */, + B3877D9B2F0FA0EA00D25D4C /* nn-NO */, + B3877D9E2F0FA10700D25D4C /* oc */, + B3877DA12F0FA12200D25D4C /* pl */, + B3877DA42F0FA13800D25D4C /* pt-BR */, + B3877DA72F0FA14200D25D4C /* pt-PT */, + B3877DAA2F0FA15300D25D4C /* ro */, + B3877DAC2F0FA16300D25D4C /* ru */, + B3877DAF2F0FA17300D25D4C /* sk */, + B3877DB12F0FA18300D25D4C /* sl */, + B3877DB42F0FA19A00D25D4C /* sq */, + B3877DB82F0FA1FA00D25D4C /* sv */, + B3877DBA2F0FA21800D25D4C /* ta */, + B3877DBE2F0FA23000D25D4C /* tr */, + B3877DC02F0FA23E00D25D4C /* uk */, + B3877DC32F0FA24900D25D4C /* vi */, + B3877DC52F0FA26000D25D4C /* zh-Hans */, + B3877DC82F0FA26700D25D4C /* zh-Hant */, ); name = InfoPlist.strings; sourceTree = ""; @@ -6307,6 +6591,59 @@ isa = PBXVariantGroup; children = ( 614D65812A79C9AC007CF449 /* en */, + B3877D2A2F0F9B4200D25D4C /* ar */, + B3877D2D2F0F9BDC00D25D4C /* af */, + B3877D302F0F9BFC00D25D4C /* am */, + B3877D332F0F9C2100D25D4C /* ast */, + B3877D362F0F9C4500D25D4C /* bg */, + B3877D392F0F9C5D00D25D4C /* bn */, + B3877D3C2F0F9C8600D25D4C /* br */, + B3877D3F2F0F9C9100D25D4C /* ca */, + B3877D422F0F9C9B00D25D4C /* cs */, + B3877D452F0F9CFE00D25D4C /* cy */, + B3877D482F0F9D0A00D25D4C /* da */, + B3877D4B2F0F9D1900D25D4C /* de */, + B3877D4E2F0F9D4200D25D4C /* el */, + B3877D512F0F9D5000D25D4C /* en-GB */, + B3877D582F0F9DB200D25D4C /* et */, + B3877D5B2F0F9DD300D25D4C /* eu */, + B3877D5F2F0F9E1600D25D4C /* fi */, + B3877D622F0F9E2000D25D4C /* fr */, + B3877D642F0F9E3F00D25D4C /* gl */, + B3877D672F0F9E5300D25D4C /* he */, + B3877D6A2F0F9E7000D25D4C /* hr */, + B3877D6E2F0F9E9500D25D4C /* hy */, + B3877D712F0F9EB000D25D4C /* id */, + B3877D742F0F9ED000D25D4C /* ig */, + B3877D772F0F9EF600D25D4C /* is */, + B3877D7A2F0F9F0D00D25D4C /* it */, + B3877D7E2F0F9F6A00D25D4C /* jv */, + B3877D812F0F9F8B00D25D4C /* ka */, + B3877D842F0F9FA800D25D4C /* kk */, + B3877D872F0F9FE800D25D4C /* km */, + B3877D892F0FA00500D25D4C /* kn */, + B3877D8C2F0FA04800D25D4C /* ko */, + B3877D8E2F0FA05B00D25D4C /* lt */, + B3877D912F0FA07A00D25D4C /* mk */, + B3877D942F0FA08F00D25D4C /* mn */, + B3877D972F0FA0B600D25D4C /* nb-NO */, + B3877D9A2F0FA0D700D25D4C /* nl */, + B3877D9D2F0FA0EA00D25D4C /* nn-NO */, + B3877DA02F0FA10800D25D4C /* oc */, + B3877DA32F0FA12300D25D4C /* pl */, + B3877DA62F0FA13900D25D4C /* pt-BR */, + B3877DA92F0FA14200D25D4C /* pt-PT */, + B3877DAE2F0FA16400D25D4C /* ru */, + B3877DB02F0FA17500D25D4C /* sk */, + B3877DB32F0FA18300D25D4C /* sl */, + B3877DB62F0FA19A00D25D4C /* sq */, + B3877DBD2F0FA22700D25D4C /* th */, + B3877DBF2F0FA23300D25D4C /* tr */, + B3877DC22F0FA23E00D25D4C /* uk */, + B3877DC42F0FA24B00D25D4C /* vi */, + B3877DC72F0FA26100D25D4C /* zh-Hans */, + B3877DCA2F0FA26700D25D4C /* zh-Hant */, + B3877DCC2F0FA28700D25D4C /* yue-Hans */, ); name = Localizable.stringsdict; sourceTree = ""; @@ -6331,6 +6668,61 @@ isa = PBXVariantGroup; children = ( B337A5A9244F1DEB00AFD13D /* en */, + B3877D292F0F9B4200D25D4C /* ar */, + B3877D2C2F0F9BDC00D25D4C /* af */, + B3877D2F2F0F9BFC00D25D4C /* am */, + B3877D322F0F9C2100D25D4C /* ast */, + B3877D352F0F9C4500D25D4C /* bg */, + B3877D382F0F9C5D00D25D4C /* bn */, + B3877D3B2F0F9C8600D25D4C /* br */, + B3877D3E2F0F9C9100D25D4C /* ca */, + B3877D412F0F9C9B00D25D4C /* cs */, + B3877D442F0F9CFE00D25D4C /* cy */, + B3877D472F0F9D0900D25D4C /* da */, + B3877D4A2F0F9D1900D25D4C /* de */, + B3877D4D2F0F9D4200D25D4C /* el */, + B3877D502F0F9D5000D25D4C /* en-GB */, + B3877D532F0F9D6D00D25D4C /* es-AR */, + B3877D552F0F9D8300D25D4C /* es */, + B3877D572F0F9DB200D25D4C /* et */, + B3877D5A2F0F9DD200D25D4C /* eu */, + B3877D5D2F0F9E0500D25D4C /* fa */, + B3877D612F0F9E2000D25D4C /* fr */, + B3877D632F0F9E3F00D25D4C /* gl */, + B3877D662F0F9E5300D25D4C /* he */, + B3877D692F0F9E7000D25D4C /* hr */, + B3877D6C2F0F9E7B00D25D4C /* hu */, + B3877D6D2F0F9E9400D25D4C /* hy */, + B3877D702F0F9EB000D25D4C /* id */, + B3877D732F0F9ED000D25D4C /* ig */, + B3877D762F0F9EF600D25D4C /* is */, + B3877D792F0F9F0D00D25D4C /* it */, + B3877D7D2F0F9F6A00D25D4C /* jv */, + B3877D802F0F9F8B00D25D4C /* ka */, + B3877D832F0F9FA800D25D4C /* kk */, + B3877D862F0F9FE800D25D4C /* km */, + B3877D8B2F0FA04800D25D4C /* ko */, + B3877D902F0FA07A00D25D4C /* mk */, + B3877D932F0FA08F00D25D4C /* mn */, + B3877D962F0FA0B500D25D4C /* nb-NO */, + B3877D992F0FA0D700D25D4C /* nl */, + B3877D9C2F0FA0EA00D25D4C /* nn-NO */, + B3877D9F2F0FA10800D25D4C /* oc */, + B3877DA22F0FA12200D25D4C /* pl */, + B3877DA52F0FA13900D25D4C /* pt-BR */, + B3877DA82F0FA14200D25D4C /* pt-PT */, + B3877DAB2F0FA15300D25D4C /* ro */, + B3877DAD2F0FA16400D25D4C /* ru */, + B3877DB22F0FA18300D25D4C /* sl */, + B3877DB52F0FA19A00D25D4C /* sq */, + B3877DB72F0FA1CC00D25D4C /* sr */, + B3877DB92F0FA1FA00D25D4C /* sv */, + B3877DBB2F0FA21800D25D4C /* ta */, + B3877DBC2F0FA22700D25D4C /* th */, + B3877DC12F0FA23E00D25D4C /* uk */, + B3877DC62F0FA26100D25D4C /* zh-Hans */, + B3877DC92F0FA26700D25D4C /* zh-Hant */, + B3877DCB2F0FA28700D25D4C /* yue-Hans */, ); name = Localizable.strings; sourceTree = ""; @@ -6344,6 +6736,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -6411,6 +6804,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -6731,6 +7125,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; diff --git a/Zotero/Assets/af.lproj/InfoPList.strings b/Zotero/Assets/af.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/af.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/af.lproj/Localizable.strings b/Zotero/Assets/af.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/af.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/af.lproj/Localizable.stringsdict b/Zotero/Assets/af.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/af.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/am.lproj/InfoPList.strings b/Zotero/Assets/am.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/am.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/am.lproj/Localizable.strings b/Zotero/Assets/am.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/am.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/am.lproj/Localizable.stringsdict b/Zotero/Assets/am.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/am.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ar.lproj/InfoPList.strings b/Zotero/Assets/ar.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ar.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ar.lproj/Localizable.strings b/Zotero/Assets/ar.lproj/Localizable.strings new file mode 100644 index 000000000..e9e599f44 --- /dev/null +++ b/Zotero/Assets/ar.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "إغلاق"; +"delete" = "حذف"; +"edit" = "تحرير"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ar.lproj/Localizable.stringsdict b/Zotero/Assets/ar.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ar.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ast.lproj/InfoPList.strings b/Zotero/Assets/ast.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ast.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ast.lproj/Localizable.strings b/Zotero/Assets/ast.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ast.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ast.lproj/Localizable.stringsdict b/Zotero/Assets/ast.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ast.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/bg.lproj/InfoPList.strings b/Zotero/Assets/bg.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/bg.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/bg.lproj/Localizable.strings b/Zotero/Assets/bg.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/bg.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/bg.lproj/Localizable.stringsdict b/Zotero/Assets/bg.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/bg.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/bn.lproj/InfoPList.strings b/Zotero/Assets/bn.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/bn.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/bn.lproj/Localizable.strings b/Zotero/Assets/bn.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/bn.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/bn.lproj/Localizable.stringsdict b/Zotero/Assets/bn.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/bn.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/br.lproj/InfoPList.strings b/Zotero/Assets/br.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/br.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/br.lproj/Localizable.strings b/Zotero/Assets/br.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/br.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/br.lproj/Localizable.stringsdict b/Zotero/Assets/br.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/br.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ca.lproj/InfoPList.strings b/Zotero/Assets/ca.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ca.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ca.lproj/Localizable.strings b/Zotero/Assets/ca.lproj/Localizable.strings new file mode 100644 index 000000000..f7bb399ae --- /dev/null +++ b/Zotero/Assets/ca.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Tancar"; +"delete" = "Esborrar"; +"edit" = "Editar"; +"last_updated" = "Darrera actualització"; +"name" = "Nom"; +"save" = "Guardar"; +"creator" = "Creador"; +"date" = "Data"; +"date_added" = "Data d'adició"; +"date_modified" = "Data de modificación"; +"item_type" = "Tipus d´ítem"; +"publication_title" = "Títol de la publicació"; +"publisher" = "Editorial"; +"title" = "Títol"; +"year" = "Any"; +"abstract" = "Resum"; +"error" = "Error"; +"warning" = "Advertencia"; +"yes" = "sí"; +"no" = "No"; +"cancel" = "Cancelar"; +"done" = "Fet"; +"ok" = "OK"; +"add" = "Afegir"; +"unknown" = "Desconegut"; +"retry" = "Reintentar"; +"page" = "Pàgina"; +"report" = "Informe"; +"total" = "Total"; +"restore" = "Restaurar"; +"copy" = "Copiar"; +"privacy_policy" = "Política de privacitat"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "Sobe Zotero"; +"recent" = "Recents"; +"look_up" = "Buscar "; +"not_found" = "No trobat"; +"share" = "Compartir"; +"select" = "Seleccionar"; +"create" = "Crear"; +"more_information" = "Més informació"; +"clear" = "Netejar"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Moure a la paperera"; +"size" = "Mida"; +"remove" = "Eliminar"; +"keep" = "Conservar"; +"cancel_all" = "Cancelar-ho tot"; +"back" = "Enrera"; +"forward" = "Endavant"; +"go_to_settings" = "Ves a configuració"; +"close_without_saving" = "Tancar sense guardar"; +"stay" = "Quedarse"; + +"migration_debug" = "L'aplicació no s'ha pogut inicialitzar i no pot funcionar correctament. Si us plau, informeu de l'ID de depuració %@ als fòrums de Zotero."; +"login_debug" = "L'aplicació no ha pogut iniciar la sessió. Torneu a iniciar la sessió i informeu de l'ID de depuració %@ als fòrums de Zotero."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Pàgina"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Títol"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Mida"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Títol"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ca.lproj/Localizable.stringsdict b/Zotero/Assets/ca.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ca.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/cs.lproj/InfoPList.strings b/Zotero/Assets/cs.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/cs.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/cs.lproj/Localizable.strings b/Zotero/Assets/cs.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/cs.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/cs.lproj/Localizable.stringsdict b/Zotero/Assets/cs.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/cs.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/cy.lproj/InfoPList.strings b/Zotero/Assets/cy.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/cy.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/cy.lproj/Localizable.strings b/Zotero/Assets/cy.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/cy.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/cy.lproj/Localizable.stringsdict b/Zotero/Assets/cy.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/cy.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/da.lproj/InfoPList.strings b/Zotero/Assets/da.lproj/InfoPList.strings new file mode 100644 index 000000000..a8f5467dc --- /dev/null +++ b/Zotero/Assets/da.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Mit bibliotek"; diff --git a/Zotero/Assets/da.lproj/Localizable.strings b/Zotero/Assets/da.lproj/Localizable.strings new file mode 100644 index 000000000..f9cfca293 --- /dev/null +++ b/Zotero/Assets/da.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Luk"; +"delete" = "Slet"; +"edit" = "Rediger"; +"last_updated" = "Sidst opdateret"; +"name" = "Navn"; +"save" = "Gem"; +"creator" = "Oprettet af"; +"date" = "Dato"; +"date_added" = "Tilføjet"; +"date_modified" = "Ændret"; +"item_type" = "Type"; +"publication_title" = "Publikationstitel"; +"publisher" = "Forlag"; +"title" = "Titel"; +"year" = "År"; +"abstract" = "Resume"; +"error" = "Fejl"; +"warning" = "Advarsel"; +"yes" = "Ja"; +"no" = "Nej"; +"cancel" = "Annuller"; +"done" = "Udført"; +"ok" = "OK"; +"add" = "Tilføj"; +"unknown" = "Ukendt"; +"retry" = "Forsøg igen"; +"page" = "Side"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Gendan"; +"copy" = "Kopier"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "Om Zotero"; +"recent" = "Seneste"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Del"; +"select" = "Vælg"; +"create" = "Opret"; +"more_information" = "Mere information"; +"clear" = "Ryd"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Flyt til papirkurv"; +"size" = "Størrelse"; +"remove" = "Fjern"; +"keep" = "Keep"; +"cancel_all" = "Annuller alle"; +"back" = "Tilbage"; +"forward" = "Frem"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Luk uden at gemme"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Brugernavn"; +"login.password" = "Adgangskode"; +"login.email" = "E-mail"; +"login.repeat_password" = "Gentag adgangskode"; +"login.forgot_password" = "Glemt adgangskode?"; + +"libraries.my_library" = "Mit bibliotek"; +"libraries.group_libraries" = "Gruppebiblioteker"; +"libraries.delete_question" = "Vil du virkelig slette „%@“?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Papirkurv"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Rediger samling"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Side"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Titel"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Størrelse"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Brugernavn"; +"settings.sync.password" = "Adgangskode"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Titel"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/da.lproj/Localizable.stringsdict b/Zotero/Assets/da.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/da.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/de.lproj/InfoPList.strings b/Zotero/Assets/de.lproj/InfoPList.strings new file mode 100644 index 000000000..a145b2bad --- /dev/null +++ b/Zotero/Assets/de.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Meine Bibliothek"; diff --git a/Zotero/Assets/de.lproj/Localizable.strings b/Zotero/Assets/de.lproj/Localizable.strings new file mode 100644 index 000000000..f281e8539 --- /dev/null +++ b/Zotero/Assets/de.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Schliessen"; +"delete" = "Löschen"; +"edit" = "Bearbeiten"; +"last_updated" = "zuletzt aktualisiert"; +"name" = "Name"; +"save" = "Speichern"; +"creator" = "Ersteller:in"; +"date" = "Datum"; +"date_added" = "Hinzugefügt am"; +"date_modified" = "Bearbeitet am "; +"item_type" = "Anhangsart"; +"publication_title" = "Titel der Publikation"; +"publisher" = "Herausgeber:in"; +"title" = "Titel"; +"year" = "Jahr"; +"abstract" = "Abstract"; +"error" = "Fehler"; +"warning" = "Warnung"; +"yes" = "Ja"; +"no" = "Nein"; +"cancel" = "Löschen"; +"done" = "Fertig"; +"ok" = "OK"; +"add" = "Hinzufügen"; +"unknown" = "Unbekannt"; +"retry" = "Erneut versuchen"; +"page" = "Seite"; +"report" = "Zusammenhang"; +"total" = "Total"; +"restore" = "Wiederherstellen"; +"copy" = "Kopieren"; +"privacy_policy" = "Datenschutzbestimmungen"; +"support_feedback" = "Support und Feedback"; +"about_zotero" = "Über Zotero"; +"recent" = "Zuletzt verwendet"; +"look_up" = "Durchsuchen"; +"not_found" = "Nicht gefunden"; +"share" = "Teilen"; +"select" = "Auswählen"; +"create" = "Erstellen"; +"more_information" = "Weitere Information"; +"clear" = "Leeren"; +"scan_text" = "Text scannen"; +"move_to_trash" = "In den Papierkorb verschieben"; +"size" = "Grösse"; +"remove" = "Entfernen"; +"keep" = "Behalten"; +"cancel_all" = "Alle löschen"; +"back" = "Zurück"; +"forward" = "Vorwärts"; +"go_to_settings" = "Zu den Einstellungen"; +"close_without_saving" = "Ohne speichern schliessen"; +"stay" = "Bleiben"; + +"migration_debug" = "Die App konnte nicht gestartet werden und funktioniert nicht ordnungsgemäss. Bitte im Zotero Forum Debug ID %@ benachrichtigen."; +"login_debug" = "Die App konnte sich nicht anmelden. Melden Sie sich erneut an und benachrichtigen Sie im Zotero Forum Debug ID %@."; +"full_sync_debug" = "Vollständige Synchronisation abgeschlossen. Bitte im Zotero Forum Debug ID %@ benachrichtigen."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organisiert Forschung wie Sie wollen. Sortieren Sie Ihre Einträge in Sammlungen und versehen Sie sie mit Stichworten"; +"onboarding.sync" = "Synchronisieren und zusammenarbeiten zwischen Geräten und aktualisiert Lesefortschritt und Notizen"; +"onboarding.annotate" = "Hervorheben und Notizen fassen direkt beim Lesen in PDFs."; +"onboarding.share" = "Tabs zum Sammeln Artikel und Bücher direkt aus dem Internet, inklusive PDFs und Metadateien."; +"onboarding.sign_in" = "Anmelden"; +"onboarding.create_account" = "Konto erstellen"; +"login.username" = "Benutzername"; +"login.password" = "Passwort"; +"login.email" = "E-Mail"; +"login.repeat_password" = "Passwort erneut eingeben"; +"login.forgot_password" = "Passwort vergessen?"; + +"libraries.my_library" = "Meine Bibliothek"; +"libraries.group_libraries" = "Gruppen Bibliotheken"; +"libraries.delete_question" = "Wollen Sie \"%@\" wirklich löschen?"; + +"collections.search_title" = "Sammlung finden"; +"collections.all_items" = "Alle Einträge"; +"collections.my_publications" = "Meine Publikationen"; +"collections.trash" = "Papierkorb"; +"collections.unfiled" = "Einträge ohne Sammlung"; +"collections.new_subcollection" = "Neue Untersammlung"; +"collections.edit_title" = "Sammlung bearbeiten"; +"collections.delete" = "Sammlung löschen"; +"collections.delete_with_items" = "Sammlung und Einträge löschen"; +"collections.create_title" = "Sammlung erstellen"; +"collections.picker_title" = "Übergeordneter Eintrag auswählen"; +"collections.empty_trash" = "Papierkorb leeren"; +"collections.collapse_all" = "Alle einklappen"; +"collections.expand_all" = "Alle ausklappen"; +"collections.create_bibliography" = "Bibliografie der Sammlung erstellen"; +"collections.download_attachments" = "Anhänge herunterladen"; +"collections.delete_attachment_files" = "Downloads entfernen"; + +"sync_toolbar.starting" = "Synchronisierung starten"; +"sync_toolbar.groups" = "Gruppen synchronisieren"; +"sync_toolbar.groups_with_data" = "Gruppen saynchronisieren (%d / %d)"; +"sync_toolbar.library" = "%@ synchronisieren"; +"sync_toolbar.object" = "%@ in %@ synchronisieren"; +"sync_toolbar.object_with_data" = "%@ in %@ synchronisieren (%d / %d)"; +"sync_toolbar.finished" = "Synchronisieren abgeschlossen"; +"sync_toolbar.deletion" = "Löschen wird angewendet in %@"; +"sync_toolbar.aborted" = "Synchronisieren fehlgeschlagen (%@)"; +"sync_toolbar.writes" = "Änderung werden hochgeladen (%d / %d)"; +"sync_toolbar.uploads" = "Anhänge werden hochgeladen (%d / %d)"; +"sync_toolbar.object.collections" = "Sammlungen"; +"sync_toolbar.object.groups" = "Gruppen"; +"sync_toolbar.object.items" = "Einträge"; +"sync_toolbar.object.searches" = "Suchen"; + +"sync.conflict_resolution.changed_item_deleted" = "Eintrag \"%@\" wurde entfernt. Möchten Sie die Änderungen behalten?"; + +"items.search_title" = "Einträge durchsuchen "; +"items.select_all" = "Alle auswählen"; +"items.deselect_all" = "alle nicht mehr anwählen"; +"items.sort_by" = "Sortieren nach"; +"items.sort_order" = "Ordnung"; +"items.ascending" = "Aufsteigend"; +"items.descending" = "Absteigend"; +"items.lookup" = "Mit Identifier hinzufüguen"; +"items.barcode" = "Barcode Scannen"; +"items.new" = "Manuell hinzufügen"; +"items.new_note" = "Neue einzelne Notiz"; +"items.new_file" = "Datei hinzufügen"; +"items.remove_from_collection_title" = "Aus Sammlung entfernen"; +"items.action.add_to_collection" = "Zu Sammlung hinzufügen"; +"items.action.remove_from_collection" = "Aus Sammlung entfernen"; +"items.action.duplicate" = "Verdoppeln"; +"items.action.create_parent" = "Übergeordneten Eintrag erstelln"; +"items.action.download" = "Herunterladen"; +"items.action.remove_download" = "Download entfernen"; +"items.action.retrieve_metadata" = "Metadaten abrufen"; +"items.filters.title" = "Filter"; +"items.filters.downloads" = "Heruntergeladene Datein"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Speichern %d / %d"; +"items.toolbar_downloaded" = "Herunterladen %d / %d"; +"items.generating_bib" = "Bibliografie erstellen"; +"items.creator_summary.and" = "%@ und %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Metadaten werden abgerufen"; + +"lookup.title" = "ISBN, DOI, PMID, arCiv, ID, oder ADS einfügen, um zur Bibliothek hinzuzufügen"; + +"citation.title" = "Zitiervorschau"; +"citation.copy_citation" = "Zitat kopieren"; +"citation.copy_bibliography" = "Bibliografie kopieren"; +"citation.preview" = "Vorschau"; +"citation.omit_author" = "Autor auslassen"; +"citation.locator_placeholder" = "Nummer"; +"citation.locator.page" = "Seite"; +"citation.locator.book" = "Buch"; +"citation.locator.chapter" = "Kapitel"; +"citation.locator.column" = "Spalte"; +"citation.locator.figure" = "Figur"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Ausgabe"; +"citation.locator.line" = "Linie"; +"citation.locator.note" = "Notiz"; +"citation.locator.opus" = "Werk"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Teil"; +"citation.locator.section" = "Abschnitt"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Band"; +"citation.locator.verse" = "Vers"; +"citation.style" = "Stil"; +"citation.language" = "Sprache"; +"citation.output_mode" = "Art der Ausgabe"; +"citation.citations" = "Zitate"; +"citation.bibliography" = "Bibliografie"; +"citation.notes" = "Notizen"; +"citation.output_method" = "Methode der Ausgabe"; +"citation.save_html" = "Als HTML speichern"; +"citation.copy" = "In Zwischenablage kopieren"; + +"item_detail.add_creator" = "Ersteller:in hinzufügen"; +"item_detail.notes" = "Notizen"; +"item_detail.add_note" = "Notiz hinzufügen"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Tag hinzufügen"; +"item_detail.attachments" = "Anhänge"; +"item_detail.add_attachment" = "Anhang hinzufügen"; +"item_detail.split_name" = "Name teilen"; +"item_detail.merge_name" = "Namen zusammenfügen"; +"item_detail.untitled" = "Titel"; +"item_detail.show_more" = "Mehr anzeigen"; +"item_detail.show_less" = "Weniger anzeigen"; +"item_detail.view_pdf" = "PDF anzeigen"; +"item_detail.data_reloaded" = "Dieser Eintrag wurde remote verändert. Er wird nicht mehr geladen."; +"item_detail.delete_attachment_file" = "Download entfernen"; +"item_detail.deleted_title" = "Gelöscht "; +"item_detail.deleted_message" = "Dieser Eintrag wurde gelöscht. Möchten Sie ihn wiederherstellen?"; +"item_detail.move_to_standalone_attachment" = "Zu eigenem Eintrag konvertieren"; + +"tag_picker.title" = "%d ausgewählt"; +"tag_picker.placeholder" = "Name als Tag"; +"tag_picker.create_tag" = "Tag \"%@\" erstellen"; +"tag_picker.confirm_deletion_question" = "Automatische Tags löschen"; +"tag_picker.search_placeholder" = "Tags durchsuchen"; +"tag_picker.deselect_all" = "alle nicht mehr anwählen"; +"tag_picker.show_auto" = "Automatische Tags anzeigen"; +"tag_picker.show_all" = "Alle Tags in dieser Bibliothek anzeigen"; +"tag_picker.delete_automatic" = "Alle automatischen Tags dieser Bibliothek löschen"; + +"creator_editor.creator" = "Ersteller-Art"; +"creator_editor.first_name" = "Vorname"; +"creator_editor.last_name" = "Nachname"; +"creator_editor.switch_to_single" = "Zu einem Feld wechseln"; +"creator_editor.switch_to_dual" = "Zu zwei Feldern wechseln"; +"creator_editor.delete_confirmation" = "Wollen Sie diesen Autor wirklich löschen?"; + +"pdf.annotations_sidebar.search_title" = "Suchen"; +"pdf.annotations_sidebar.add_comment" = "Kommentar hinzufügen"; +"pdf.annotations_sidebar.add_tags" = "Tags hinzufügen"; +"pdf.annotations_sidebar.merge" = "Zusammenfügen"; +"pdf.annotations_sidebar.filter.title" = "Anmerkungen filtern"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Tags auswählen"; +"pdf.search.title" = "In Dokument suchen"; +"pdf.search.failed" = "Suche fehlgeschlagen"; +"pdf.search.dismiss" = "Suche sistieren"; +"pdf.annotation_popover.title" = "Anmerkung anpassen"; +"pdf.annotation_popover.delete" = "Anmerkung löschen"; +"pdf.annotation_popover.update_subsequent_pages" = "Folgende Seiten anpassen"; +"pdf.annotation_popover.page_label_title" = "Seitennummer anpassen"; +"pdf.annotation_popover.no_comment" = "Kein Kommentar"; +"pdf.annotation_popover.line_width" = "Breite"; +"pdf.annotation_popover.size" = "Grösse"; +"pdf.deleted_title" = "Gelöscht "; +"pdf.deleted_message" = "Dieses Dokument wurde gelöscht. Wollen Sie es wiederherstelltn?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Anstreichen"; +"pdf.underline" = "Unterstreichen"; +"pdf.annotation_share.image.share" = "Foto teilen"; +"pdf.annotation_share.image.medium" = "Mittel"; +"pdf.annotation_share.image.large" = "Gross"; +"pdf.annotation_toolbar.eraser" = "Raddiergummi"; +"pdf.annotation_toolbar.highlight" = "Anstreichen"; +"pdf.annotation_toolbar.note" = "Notiz"; +"pdf.annotation_toolbar.image" = "oto"; +"pdf.annotation_toolbar.ink" = "Tinte"; +"pdf.annotation_toolbar.underline" = "Unterstreichen"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Gesperrt"; +"pdf.locked.enter_password" = "Bitte Passwort eingeben, um das Dokument zu öffnen"; +"pdf.locked.failed" = "Falsches Passwort. Bitte erneut versuchen."; +"pdf.settings.scroll_direction.title" = "Scroll Richtung"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Waagerecht"; +"pdf.settings.page_transition.title" = "Seitenübergang"; +"pdf.settings.page_transition.jump" = "Springen"; +"pdf.settings.page_transition.continuous" = "Bildlauf"; +"pdf.settings.appearance.title" = "Erscheinung"; +"pdf.settings.appearance.auto" = "Automatisch"; +"pdf.settings.appearance.light_mode" = "Hell"; +"pdf.settings.appearance.dark_mode" = "Dunkel"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Seitenansicht"; +"pdf.settings.page_mode.single" = "Einzeln"; +"pdf.settings.page_mode.double" = "Doppelt"; +"pdf.settings.page_mode.automatic" = "Automatisch"; +"pdf.settings.page_fitting.title" = "Seite passend"; +"pdf.settings.page_fitting.fit" = "Anpassen"; +"pdf.settings.page_fitting.fill" = "Füllen"; +"pdf.settings.page_spreads.title" = "Seite erweitern"; +"pdf.settings.page_spreads.odd" = "Ungerade"; +"pdf.settings.page_spreads.even" = "Gerade"; +"pdf.settings.page_fitting.automatic" = "Automatisch"; +"pdf.export.export" = "PDF exportieren"; +"pdf.export.export_annotated" = "PDF mit Anmerkungen exportieren"; +"pdf.sidebar.no_annotations" = "Keine Anmerkungen"; +"pdf.sidebar.no_outline" = "Keine Kurzfassung"; +"pdf.delete_annotation" = "Wollen Sie diese Anmerkung wirklich löschen?"; +"pdf.previous_page" = "Vorherige Seite"; +"pdf.next_page" = "Nächste Seite"; +"pdf.previous_viewport" = "Vorherige Ansicht"; +"pdf.next_viewport" = "Nächste Ansicht"; + +"settings.title" = "Einstellungen"; +"settings.logout" = "Abmelden"; +"settings.logout_warning" = "Alle lokalen Datein, die nicht synchronisiert waren, werden gelöscht. Wollen Sie sich wirklich abmelden?"; +"settings.general.title" = "Allgemein"; +"settings.general.show_subcollections_title" = "Einträge der Untersammlungen anzeigen"; +"settings.general.show_collection_item_counts" = "Grösse der Sammlungen anzeigen"; +"settings.general.open_links_in_external_browser" = "Links in Browser öffnen"; +"settings.general.autoempty_title" = "Papierkorb leeren"; +"settings.general.never" = "Nie"; +"settings.item_count" = "Anzahl Einträge"; +"settings.item_count_subtitle" = "Anzahl Einträge für alle Sammlungen anzeigen"; +"settings.sync.title" = "Konto"; +"settings.sync.data_syncing" = "Daten Synchronisieren"; +"settings.sync.file_syncing" = "Dateine synchronisieren"; +"settings.sync.file_syncing_type_message" = "Angehängte Dateien in 'Meine Bibliothek' synchronisieren"; +"settings.sync.account" = "Konto"; +"settings.sync.manage_account" = "Konto verwalten"; +"settings.sync.delete_account" = "Konto löschen"; +"settings.sync.username" = "Benutzername"; +"settings.sync.password" = "Passwort"; +"settings.sync.verify" = "Server überprüfen"; +"settings.sync.directory_not_found.title" = "Verzeichnis nicht gefunden"; +"settings.sync.directory_not_found.message" = "%@ wurde nicht gefunden. Wollen Sie es erstellen?"; +"settings.sync.verified" = "Verifiziert"; +"settings.permission" = "Nutzer-Berechtigung"; +"settings.permission_subtitle" = "Bei jedem Schreiben nach Erlaubnis fragen"; +"settings.translators" = "Übersetzer"; +"settings.translators_update" = "Übersetzer aktualisieren"; +"settings.translators_updating" = "aktualisieren..."; +"settings.reset_to_bundled" = "Zur gebündelten Form zurückführen"; +"settings.debug" = "Output Logging debuggen"; +"settings.logging_title" = "Protokoll"; +"settings.start_logging" = "Protokoll starten"; +"settings.start_logging_on_launch" = "Protkoll bei nächstem Aufstarten beginnen"; +"settings.cancel_logging" = "Protokoll löschen"; +"settings.stop_logging" = "Protokoll aufhören"; +"settings.view_output" = "Output ansehen"; +"settings.clear_output" = "Output entfernen"; +"settings.logging_desc1" = "Um einen Debug-Prozess beim Start zu beginnen, zwangsschliessen sie die App und starten Sie sie neu"; +"settings.logging_desc2" = "Um einen Fehler einer geteilten Erweiterung zu beheben, Erweiterung öffnen."; +"settings.send_manually" = "Manuell senden"; +"settings.log_alert.progress_title" = "Logs senden"; +"settings.log_alert.title" = "Logs gesendet"; +"settings.log_alert.message" = "Ihre Debug-ID ist %@"; +"settings.crash_alert.title" = "Crash-Log gesendet"; +"settings.crash_alert.message" = "Ihre Meldungs-ID ist %@. Bitte posten Sie eine Nachricht im Zotero Forum (forums.zotero.org) mit der Meldungs-ID und den nötigen Schritten um den Crash hervorzurufen."; +"settings.crash_alert.message_with_db" = "Ihre Meldungs-ID ist %@. Bitte posten Sie eine Nachricht im Zotero Forum (forums.zotero.org) mit der Meldungs-ID und den nötigen Schritten um den Crash hervorzurufen.Wenn Zotero wiederholt abstürzt, drücken sie bitte \"Database exporiteren\" und senden sie die exportierten Dateien an support@zotero.org."; +"settings.crash_alert.submit_forum" = "In Zotero Forums einfügen"; +"settings.crash_alert.export_db" = "Database kopieren und exportieren"; +"settings.crash_alert.copy" = "In Zwischenablage kopieren"; +"settings.websocket_title" = "Server Verbindung"; +"settings.websocket_connected" = "Verbunden"; +"settings.websocket_connecting" = "Verbindung wird hergestellt"; +"settings.websocket_disconnected" = "Nicht verbunden"; +"settings.websocket_disconnect" = "Vom Server getrennt"; +"settings.websocket_connect" = "Mit Server verbinden"; +"settings.storage" = "Lokaler Speicher"; +"settings.storage.delete_all" = "Alle lokal gespeicherten Anhänge löschen"; +"settings.storage.delete_all_question" = "Sind Sie sicher, dass sie alle Anhänge von diesem Gerät löschen wollen?Andere synchronisierte Geräte sind davon nicht betroffen."; +"settings.storage.delete_library_question" = "Sind Sie sicher, dass sie alle Anhänge in %@ von diesem Gerät löschen wollen? Andere synchronisierte Geräte sind davon nicht betroffen."; +"settings.saving.title" = "Speichert"; +"settings.saving.files_title" = "Dateien speichern"; +"settings.saving.files_message" = "Verwandte PDF-Dokumente automatisch anhängen, wenn gespeichert"; +"settings.saving.tags_title" = "Automatische Tags speichern"; +"settings.saving.tags_message" = "Einträge automatisch mit Stichworten und Titeln versehen"; +"settings.cite.title" = "Zitieren"; +"settings.cite.styles_title" = "Zitierstile"; +"settings.cite.get_more_styles" = "Zusätzliche Zitierstile erhalten"; +"settings.cite_search.search_title" = "Stile durchsuchen"; +"settings.export.title" = "Kopie"; +"settings.export.default_format" = "Standard-Format"; +"settings.export.language" = "Sprache"; +"settings.export.copy_as_html" = "Als HTML kopieren"; +"settings.versionAndBuild" = "Version %@ Build-Nummer %@"; +"settings.export_db" = "Database-Datei exportieren"; +"settings.full_sync_debug" = "Fortgeschritten"; +"settings.full_sync.start" = "Starten der Fehlerbehebung der vollständigen Synchronisation"; +"settings.full_sync.other_in_progress" = "Eine Synchronisierung läuft bereits. Bitte warten Sie bis diese abgeschlossen ist."; +"settings.full_sync.in_progress" = "Eine vollständige Synchronisierung läuft bereits. Bitte warten Sie bis diese abgeschlossen ist. und posten Sie im Zotero-Forum die Debug-ID."; +"settings.annotation_tools" = "Anmerkungstool"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Zurücksetzen"; + +"shareext.save" = "In Zotero speichern"; +"shareext.decoding_attachment" = "Nach Einträgen Suchen"; +"shareext.translation.item_selection" = "Eintrag auswählen"; +"shareext.translation.translating_with" = "Mit %@ speichern"; +"shareext.loading_collections" = "Sammlungen laden"; +"shareext.sync_error" = "Sammlungen konnten nicht synchronisiert werden"; +"shareext.collection_other" = "Mehr"; +"shareext.item_title" = "Eintrag"; +"shareext.collection_title" = "Sammlung"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Suchen"; +"searchbar.accessibility_cancel" = "Suche löschen"; +"searchbar.accessibility_clear" = "Suche leeren"; + +"errors.schema" = "Einige Dateien in Meine Bibliothek konnten nicht heruntergeladen werden. Sie wurde möglicherweise mit einer neueren Version von Zotero gespeichert."; +"errors.parsing" = "Einige Dateien konnten nicht gefunden werden. Andere Dateien werden weiter synchronisiert."; +"errors.api" = "%@ Fehler der API-Antwort"; +"errors.db" = "Konnte nicht mit Database verbinden. Der Gerätespeicher ist möglicherweise voll."; +"errors.versionMismatch" = "Eine verngesteuerete Änderung wurde während der Synchronisation vorgenommen"; +"errors.unknown" = "Unbekannter Fehler"; +"errors.attachments.cant_unzip_snapshot" = "Snapshot konnte nicht extrahiert werden"; +"errors.attachments.incompatible_attachment" = "Verlinkte Dateien werden auf mobilen Geräten nicht unterstützt. Versuchen Sie sie auf der Desktop-Version zu öffnen."; +"errors.attachments.cant_open_attachment" = "Der Anhang wurde nicht gefunden"; +"errors.attachments.missing_zotero" = "Der Anhang ist in der Online-Bibliothek nicht verfügbar."; +"errors.attachments.missing_webdav" = "Der Anhang ist auf dem WebDAV-Server nicht verfügbar."; +"errors.attachments.missing_additional" = "Bitte überprüfen Sie, ob die Datei auf dem Gerät synchronisiert wurde auf dem sie hinzugefügt wurde."; +"errors.attachments.unauthorized_webdav" = "Der WebDAV-Server akzeptiert den Benutzernamen und das Passowort nicht, welches in den Einstellungen gespeichert wurde."; +"errors.attachments.too_many_requests_webdav" = "Der WebDAV-Server beschränkt ihre Anfrage. Versuchen Sie es in einigen Minuten erneut."; +"errors.attachments.too_many_requests" = "Zu viele Anfrgen. Versuchen SIe es in einigen Minuten erneut."; +"errors.attachments.forbidden_webdav" = "Sie haben keine Erlaubnis um auf %@ auf dem WebDAV-Server zuzugreifen"; +"errors.attachments.generic_filename" = "die Datei"; +"errors.login.invalid_password" = "Ungültiges Passwort"; +"errors.login.invalid_username" = "ungültiger Benutzername"; +"errors.login.invalid_credentials" = "Ungültiger Benutzername oder Passwort"; +"errors.libraries.cantLoad" = "Bibliotheken konnten nicht geladen werden"; +"errors.collections.empty_name" = "Geben Sie einen Sammlungs-Namen ein"; +"errors.collections.save_failed" = "Sammlung konnte nicht gespeichert werden"; +"errors.collections.bibliography_failed" = "NIcht alle Einträge der Bibliografie konnten geladen werden"; +"errors.sync.group_removed" = "Die Gruppe \"%@\" ist nicht mehr verfügbar. Was wollen Sie tun?"; +"errors.sync.metadata_write_denied" = "Sie können nicht mehr in die Gruppe \"%@\" schreiben. Was wollen Sie tun?"; +"errors.sync.revert_to_original" = "Zu Original zurückverwandeln"; +"errors.sync.file_write_denied" = "Sie haben keine Erlaubnis die Einträge der Gruppe \"%@\" zu bearbeiten, die Dateien, welche Sie lokal gespeichert haben, können nicht hochgeladen werden. Fahren Sie fort, werden alle Dateien in %@ auf ihren Stand zurückgesetzt. Wollen Sie die Dateien an einem anderen Ort bearbeiten, erfragen Sie Zugang beim Gruppen-Administrator. Sie können die Synchronisation nun beenden."; +"errors.sync.reset_group_files" = "Gruppen-Datein zurücksetzen und synchronisieren"; +"errors.sync.skip_group" = "Gruppe überspringen"; +"errors.sync_toolbar.finished_with_errors" = "Synchronisieren abgeschlossen (%@)"; +"errors.sync_toolbar.attachment_missing" = "Hochladen des Anhangs %@ nicht möglich. Bitte entfernen und fügen sie den Anhang erneut hinzu."; +"errors.sync_toolbar.libraries_missing" = "Keine Bibliothek gefunden. Bitte ausloggen und erneut einloggen."; +"errors.sync_toolbar.groups_failed" = "Gruppen konnten nicht synchronisiert werden. Bitte erneut versuchen."; +"errors.sync_toolbar.conflict_retry_limit" = "Andere Synchronisation läuft. Versuchen Sie es in einigen Minuten erneut."; +"errors.sync_toolbar.group_permissions" = "Sie haben keine Erlaubnis diese Gruppen zu bearbeiten"; +"errors.sync_toolbar.internet_connection" = "Verbindung mit Netzwerk nicht möglich. Bitte erneut versuchen. "; +"errors.sync_toolbar.personal_quota_reached" = "SIe haben Ihr Zotero Speicher-Limit erreicht. Einige Dateien wurden nicht hochgeladen. Andere Dateien werden weiterhin synchronisiert. Um Optionen für Speichererweiterungen zu finden, besuchen Sie zotero.org unter Kontoeinstellungen"; +"errors.sync_toolbar.group_quota_reached" = "Die Gruppe \"@%\" hat ihr Zotero Speicherlimit erreicht.Einige Dateien wurden nicht hochgeladen. Andere Dateien werden weiterhin synchronisiert. Der Gruppen-Inhaber kann Speichererweiterungen unter zotero.org erwerben."; +"errors.sync_toolbar.insufficient_space" = "Sie haben nicht genug Platz auf ihrem WebDAV-Server. Einige Dateien wurden nicht hochgeladen. Andere Dateien werden weiterhin synchronisiert. "; +"errors.sync_toolbar.quota_reached_short" = "Limit erreicht"; +"errors.sync_toolbar.unavailable" = "Zotero ist zeitweise nicht erreichbar. Versuchen Sie es in einigen Minuten erneut."; +"errors.sync_toolbar.webdav_error" = "Folgende Datei konnte nicht vom WebDAV-Server gelöscht werden: \"%@\""; +"errors.sync_toolbar.webdav_item_prop" = "Ungültige Datei: %@"; +"errors.sync_toolbar.show_item" = "Zeige Eintrag"; +"errors.sync_toolbar.show_items" = "Zeige Einträge"; +"errors.sync_toolbar.forbidden" = "Ungültiger Benutzername oder Passwort"; +"errors.sync_toolbar.forbidden_message" = "Der Server hat ihr Passwort und Benutzernamen nicht akzeptiert. Bitte melden Sie sich ab und mit den korrekten Eingaben erneut an."; +"errors.sync_toolbar.webdav_request_failed" = "Ihr WebDAV-Server hat einen HTTP %d Fehler zurückgemeldet für folgende Anfrage: %@"; +"errors.items.loading" = "Einträge konnten nicht geladen werden"; +"errors.items.deletion" = "Eintrag konnte nicht entfernt werden"; +"errors.items.deletion_from_collection" = "Eintrag konnte nicht aus der Sammlung entfernt werden"; +"errors.items.add_to_collection" = "Eintrag konnte nicht zur Sammlung hinzugefügt werden"; +"errors.items.move_item" = "Eintrag konnte nicht verschoben werden"; +"errors.items.save_note" = "Notiz konnte nicht gespeichert werden"; +"errors.items.add_attachment" = "Anhang konnte nicht hinzugefügt werden"; +"errors.items.add_some_attachments" = "Einige Anhänge wurden nicht hinzugefügt: %@"; +"errors.items.load_duplication" = "Eintrag konnte nicht zur Duplikation geladen werden"; +"errors.items.generating_bib" = "Bibliografie konnte nicht generiert werden"; +"errors.citation_preview" = "Zitierstil-Vorschau konnte nicht generiert werden"; +"errors.item_detail.dropped_fields_title" = "Eintragsart ändern"; +"errors.item_detail.dropped_fields_message" = "Sind Sie sich sicher die Eintragsart ändern zu wollen? Folgende Felder würden gelöscht: %@"; +"errors.item_detail.cant_load_data" = "Daten konnten nicht geladen werden. Bitte erneut versuchen."; +"errors.item_detail.cant_create_attachments_with_names" = "Anhänge konnten nicht erstellt werden: %@"; +"errors.item_detail.cant_create_attachments" = "Anhänge konnten nicht erstellt werden"; +"errors.item_detail.cant_save_note" = "Notiz konnte nicht gespeichert werden"; +"errors.item_detail.cant_save_changes" = "Änderung konnte nicht gespeichert werden"; +"errors.item_detail.cant_trash_item" = "Eintrag konnte nicht in den Papierkorb verschoben werden"; +"errors.item_detail.cant_save_tags" = "Tags konnten nicht gespeichert werden"; +"errors.item_detail.unsupported_type" = "Art \"%@\" nicht unterstützt"; +"errors.settings.storage" = "Speicherdaten konnten nicht gesammelt werden"; +"errors.settings.webdav.file_missing_after_upload" = "Ein mögliches Problem ihres WebDAV-Servers.Eine hochgeladene kann nicht sofort heruntergeladen werden. Es gibt eine kurze Übergangsphase zwischen dem Hochladen und dem Verfügbarmachen, insbesondere, wenn eine Cloud-Lösung verwendet wird.Wenn die Synchronisation manuell funktioniert, können Sie diese Nachricht ignorieren. Treten Schwierigkeiten auf, posten Sie diese im Zotero-Forum."; +"errors.settings.webdav.invalid_url" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.no_password" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.no_url" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.no_username" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.not_dav" = "Ungültige WebDAV-URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV Verifikationsfehler"; +"errors.settings.webdav.unauthorized" = "Der WebDAV-Server akzeptiert den Benutzernamen und das Passowort nicht, welches eingegeben wurde"; +"errors.settings.webdav.forbidden" = "SIe haben keine Erlaubnis auf diesen Ordner im WebDAV-Server zuzugreifen."; +"errors.settings.webdav.internet_connection" = "Verbindung mit Netzwerk nicht möglich. Bitte erneut versuchen. "; +"errors.settings.webdav.host_not_found" = "Es konnte keine Verbingung mit dem WebDAV-Server hergestellt werden "; +"errors.settings.webdav.ats" = "Wegen iOS-Einschränkungen müssen Sie HTTPS verwenden, um sich mit einem nicht-lokalne WebDAV-Server zu verbidnen"; +"errors.shareext.logged_out" = "Bitte einloggen, bevor diese Erweiterung verwendet wird"; +"errors.shareext.cant_load_data" = "Daten konnten nicht geladen werden. Bitte erneut versuchen."; +"errors.shareext.unknown" = "Ein unbekannter Fehler ist aufgetreten"; +"errors.shareext.cant_load_schema" = "Ein Fehler ist aufgetreten. Bitte öffnen SIe Zotero, synchronisieren Sie und probieren Sie es erneut"; +"errors.shareext.download_failed" = "Datei konnte nicht heruntergeladen werden"; +"errors.shareext.items_not_found" = "Keine Einträge auf dieser Seite gefunden"; +"errors.shareext.schema_error" = "EInige Dateien konnten nicht heruntergeladen werden. SIe sind eventuell auf einer neueren Version von Zotero verfügbar"; +"errors.shareext.translation_failed" = "Speichern fehlgeschlagen"; +"errors.shareext.response_missing_data" = "Ein Fehler ist aufgetreten. Bitte erneut versuchen"; +"errors.shareext.failed_additional" = "Sie können diese Seite als Webpage-Eintrag speichern"; +"errors.shareext.file_not_pdf" = "PDF konnte nicht gespeichert werden"; +"errors.shareext.api_error" = "Fehler beim hochladen der Datei. Der Eintrag wurde lokal gespeichert."; +"errors.shareext.webdav_error" = "Fehler beim Hochladen auf den WebDAV-Server"; +"errors.shareext.personal_quota_reached" = "Sie haben die Grenze ihres Zotero-Speichers erreicht, die Datei konnte nicht hochgeladen werden. Schauen Sie in ihre Kontoeinstellungen für die Option den Speicherplatz zu erweitern. Diese Datei wurde lokal gespeichert."; +"errors.shareext.group_quota_reached" = "Die Gruppe \"%@\" hat die Grenze des Speicherplatzes erreicht, die Datei konnte nicht hochgeladen werden. Der Eigentümer der Gruppe kann in seinen Konto-Einstellungen die Optionen auf Speicherplatzerweiterungen einsehen.Die Datei wurde lokal gespeichert."; +"errors.shareext.forbidden" = "Sie haben die nötige Erlaubnis nicht um diese Datei zu %@ hinzuzufügen."; +"errors.shareext.webdav_not_verified" = "WebDAV Verifikationsfehler"; +"errors.shareext.requires_browser" = "Dieser Inhalt muss in einem Browser geladen werden, um mit Zotero geteilt zu werden. Im Browser öffnen und via \"Teilen-Button\" zu Zotero hinzufügen."; +"errors.db_failure" = "Fehler beim Erstellen der Datenbank. Versuche Sie sich erneut einzuloggen."; +"errors.logging.title" = "Fehlerbehebung"; +"errors.logging.start" = "Start der Fehlerbehebung unmöglich"; +"errors.logging.no_logs_recorded" = "Kein Fehlerbehebungsoutput während der Anmeldung"; +"errors.logging.upload" = "Protokolle konnten nicht hochgeladen werden. Erneut versuchen"; +"errors.logging.response_parsing" = "Unerwartete Antwort des Servers"; +"errors.translators.bundle_loading" = "Übersetzer konnte nicht aktualisiert werden. Erneut versuchen?"; +"errors.styles.addition" = "Stil \"%@\" konnte nicht hinzugefügt werden"; +"errors.styles.deletion" = "Stil \"%@\" konnte nicht gelöscht werden"; +"errors.styles.loading" = "Stile konnten nicht geladen werden"; +"errors.styles_search.loading" = "Stile konnten nicht geladen werden. Erneut versuchen?"; +"errors.citation.generate_citation" = "Zitat konnte nicht generiert werden"; +"errors.citation.generate_bibliography" = "Bibliografie konnte nicht generiert werden"; +"errors.citation.invalid_types" = "Ungültiger Dateityp ausgewählt"; +"errors.citation.missing_style" = "Kein Zitierstil ausgewählt. Einstellungen > Quick Copy > Neuer Zitierstil auswählen"; +"errors.citation.open_settings" = "Einstellungen öffnen"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero konnte keinen Identifier finden. Überprüfen Sie ihre Eingabe"; +"errors.lookup.no_identifiers_with_lookup_data" = "Zoter konnte keinen neuen Identifier in Ihrer Eingabe finden. Überprüfen Sie ihre Eingabe und versuchen Sie es erneut."; +"errors.pdf.merge_too_big_title" = "Eintragsnotizen konnten nicht zusammengefügt werden"; +"errors.pdf.merge_too_big" = "Zusammengeführte Notiz wäre zu gross"; +"errors.pdf.cant_update_annotation" = "Notiz kann nicht hochgeladen werden"; +"errors.pdf.cant_add_annotations" = "Notiz kann nicht hinzugefügt werden "; +"errors.pdf.cant_delete_annotations" = "Notiz kann nicht gelöscht werden"; +"errors.pdf.incompatible_document" = "Dieses Dokument wird nicht unterstützt"; +"errors.pdf.empty_document" = "Dieses Dokument ist leer"; +"errors.pdf.page_index_not_int" = "Falsches Format für dieses Dokument gespeichert"; +"errors.pdf.document_changed" = "DIeses Dokument wurde auf einem anderen Gerät verändert. Erneut öffnen um weiterhin zu bearbeiten"; + +"accessibility.untitled" = "Titel"; +"accessibility.locked" = "Gesperrt"; +"accessibility.archived" = "Archiviert"; +"accessibility.collections.items" = "Einträge"; +"accessibility.collections.expand" = "Erweitern "; +"accessibility.collections.collapse" = "Weniger anzeigen"; +"accessibility.collections.create_collection" = "Sammlung erstellen"; +"accessibility.collections.search_collections" = "Sammlungen durchsuchen"; +"accessibility.collections.expand_all_collections" = "Alle Sammlungen erweitern"; +"accessibility.items.open_item" = "Dateiinformation öffnen"; +"accessibility.items.select_items" = "Eintrag auswählen"; +"accessibility.items.select_all_items" = "Alle Einträge auswählen"; +"accessibility.items.deselect_all_items" = "Alle Einträge nicht mehr auswählen"; +"accessibility.items.filter_items" = "Einträge filtern"; +"accessibility.items.sort_items" = "Einträge sortieren"; +"accessibility.items.add_to_collection" = "Ausgewählte Einträge zur Sammlung hinzufügen"; +"accessibility.items.remove_from_collection" = "Ausgewählte Einträge von der Sammlung entfernen"; +"accessibility.items.trash" = "Ausgewählte Einträge in den Papierkorb verschieben"; +"accessibility.items.delete" = "Ausgewählte Einträge löschen"; +"accessibility.items.restore" = "Ausgewählte Einträge wiederherstellen"; +"accessibility.items.duplicate" = "Ausgewählte Einträge duplizieren"; +"accessibility.items.share" = "Ausgewählte Einträge teilen"; +"accessibility.items.download_attachments" = "Anhänge der ausgewählten Einträge herunterladen"; +"accessibility.items.remove_downloads" = "Heruntergeladene Dateien der ausgewählten Einträge entfernen"; +"accessibility.items.collection" = "Sammlung"; +"accessibility.item_detail.download_and_open" = "Doppelklick um herunterzuladen und zu öffnen"; +"accessibility.item_detail.open" = "Doppelklick zum öffnen"; +"accessibility.pdf.sidebar_open" = "Sidebar öffnen"; +"accessibility.pdf.sidebar_close" = "Sidebar schliessen"; +"accessibility.pdf.share" = "PDF teilen"; +"accessibility.pdf.export" = "PDF exportieren"; +"accessibility.pdf.export_annotated" = "PDF mit Anmerkungen exportieren"; +"accessibility.pdf.settings" = "Einstellungen"; +"accessibility.pdf.color_picker" = "Farbenfinder"; +"accessibility.pdf.highlight_annotation_tool" = "Hervorhebung erstellen"; +"accessibility.pdf.note_annotation_tool" = "Anmerkung erstellen"; +"accessibility.pdf.image_annotation_tool" = "Bildunterschrift erstellen"; +"accessibility.pdf.ink_annotation_tool" = "Schrift-Notiz erstellen"; +"accessibility.pdf.underline_annotation_tool" = "Unterstreichung erstellen"; +"accessibility.pdf.text_annotation_tool" = "Kommentar erstellen"; +"accessibility.pdf.eraser_annotation_tool" = "Raddiergummi"; +"accessibility.pdf.highlight_annotation" = "Hervorhebung"; +"accessibility.pdf.note_annotation" = "Notiz"; +"accessibility.pdf.image_annotation" = "Bildunterschrift"; +"accessibility.pdf.ink_annotation" = "Schrift-Anmerkung"; +"accessibility.pdf.underline_annotation" = "Unterstreichung"; +"accessibility.pdf.text_annotation" = "Kommentar"; +"accessibility.pdf.edit_annotation" = "Anmerkung bearbeiten"; +"accessibility.pdf.share_annotation" = "Anmerkung teilen"; +"accessibility.pdf.share_annotation_image" = "Bildunterschrift teilen"; +"accessibility.pdf.eraser_annotation" = "Raddiergummi"; +"accessibility.pdf.highlighted_text" = "Hervorhebung"; +"accessibility.pdf.underlined_text" = "Unterstrichener Text"; +"accessibility.pdf.author" = "Autor:in"; +"accessibility.pdf.comment" = "Kommentar"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Doppelklick zum Anwählen und Ändern"; +"accessibility.pdf.tags_hint" = "Doppelklick um Tags anzupassen"; +"accessibility.pdf.selected" = "Ausgewählt"; +"accessibility.pdf.search_pdf" = "PDF durchsuchen"; +"accessibility.pdf.redo" = "Wiedermachen"; +"accessibility.pdf.undo" = "Rückgängig machen"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toolbar umschalten"; +"accessibility.pdf.show_more_tools" = "Mehr anzeigen"; +"accessibility.htmlepub.search_html" = "Webseite durchsuchen"; +"accessibility.htmlepub.search_epub" = "EPUB durchsuchen"; +"accessibility.speech.play" = "Sprechen starten"; +"accessibility.speech.pause" = "Sprechen pausieren"; +"accessibility.speech.forward" = "Überspringen"; +"accessibility.speech.backward" = "Zurück"; +"accessibility.speech.title" = "Laut vorlesen"; +"accessibility.show_reader" = "Lese-Modus"; +"accessibility.show_reader_accessibility_label" = "Zum Lese-Modus wechseln"; +"accessibility.show_speech" = "Laut vorlesen"; +"accessibility.show_speech_accessibility_label" = "Laut vorlesen beginnen"; +"accessibility.open_document_accessibility" = "Barriere-Optionen öffnen"; diff --git a/Zotero/Assets/de.lproj/Localizable.stringsdict b/Zotero/Assets/de.lproj/Localizable.stringsdict new file mode 100644 index 000000000..e8240d494 --- /dev/null +++ b/Zotero/Assets/de.lproj/Localizable.stringsdict @@ -0,0 +1,92 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %d ausgewählte Sammlungen + other + %d ausgewählte Sammlungen + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Wollen Sie die ausgewählten Einträge wirklich löschen? + other + Wollen Sie die ausgewählten Einträge wirklich löschen? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/el.lproj/InfoPList.strings b/Zotero/Assets/el.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/el.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/el.lproj/Localizable.strings b/Zotero/Assets/el.lproj/Localizable.strings new file mode 100644 index 000000000..534d96897 --- /dev/null +++ b/Zotero/Assets/el.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "ΟΚ"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/el.lproj/Localizable.stringsdict b/Zotero/Assets/el.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/el.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/en-GB.lproj/InfoPList.strings b/Zotero/Assets/en-GB.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/en-GB.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/en-GB.lproj/Localizable.strings b/Zotero/Assets/en-GB.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/en-GB.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/en-GB.lproj/Localizable.stringsdict b/Zotero/Assets/en-GB.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/en-GB.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/es-AR.lproj/InfoPList.strings b/Zotero/Assets/es-AR.lproj/InfoPList.strings new file mode 100644 index 000000000..434286abc --- /dev/null +++ b/Zotero/Assets/es-AR.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Mi biblioteca"; diff --git a/Zotero/Assets/es-AR.lproj/Localizable.strings b/Zotero/Assets/es-AR.lproj/Localizable.strings new file mode 100644 index 000000000..e1a9def1d --- /dev/null +++ b/Zotero/Assets/es-AR.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Cerrar"; +"delete" = "Eliminar"; +"edit" = "Editar"; +"last_updated" = "Última actualización"; +"name" = "Nombre"; +"save" = "Guardar"; +"creator" = "Creador"; +"date" = "Fecha"; +"date_added" = " Fecha de adición"; +"date_modified" = "Fecha de modificación"; +"item_type" = "Tipo de elemento"; +"publication_title" = "Título de publicación"; +"publisher" = "Editorial"; +"title" = "Título"; +"year" = "Año"; +"abstract" = "Resumen"; +"error" = "Error"; +"warning" = "Alerta"; +"yes" = "Sí"; +"no" = "No"; +"cancel" = "Cancelar"; +"done" = "Listo"; +"ok" = "Ok"; +"add" = "Añadir"; +"unknown" = "Desconocido"; +"retry" = "Reintentar"; +"page" = "Página"; +"report" = "Reporte"; +"total" = "Total"; +"restore" = "Restaurar"; +"copy" = "Copiar"; +"privacy_policy" = "Política de privacidad"; +"support_feedback" = "Soporte y comentarios"; +"about_zotero" = "Sobre Zotero"; +"recent" = "Recientes"; +"look_up" = "Buscar"; +"not_found" = "No encontrado"; +"share" = "Compartir"; +"select" = "Seleccionar"; +"create" = "Crear"; +"more_information" = "Más información"; +"clear" = "Limpiar"; +"scan_text" = "Escanear texto"; +"move_to_trash" = "Mover al basurero"; +"size" = "Tamaño"; +"remove" = "Remover"; +"keep" = "Mantener"; +"cancel_all" = "Cancelar todo"; +"back" = "Atrás"; +"forward" = "Adelante"; +"go_to_settings" = "Ir a la configuración"; +"close_without_saving" = "Cerrar sin guardar"; +"stay" = "Permanecer"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organiza la investigación como usted desee. Clasifique sus elementos en colecciones y etiquételos con palabras clave."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Acceder"; +"onboarding.create_account" = "Registrarse"; +"login.username" = "Nombre de usuario"; +"login.password" = "Contraseña"; +"login.email" = "Correo electrónico"; +"login.repeat_password" = "Repetir contraseña"; +"login.forgot_password" = "¿Olvidó su contraseña?"; + +"libraries.my_library" = "Mi biblioteca"; +"libraries.group_libraries" = "Bibliotecas de grupo"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Buscar colección"; +"collections.all_items" = "Todos los elementos"; +"collections.my_publications" = "Mis publicaciones"; +"collections.trash" = "Papelera"; +"collections.unfiled" = "Elementos sin archivar"; +"collections.new_subcollection" = "Nueva subcolección"; +"collections.edit_title" = "Editar colección"; +"collections.delete" = "Eliminar colección"; +"collections.delete_with_items" = "Eliminar colección y elementos"; +"collections.create_title" = "Crear colección"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Vaciar la papelera"; +"collections.collapse_all" = "Contraer todo"; +"collections.expand_all" = "Expandir todo"; +"collections.create_bibliography" = "Crear bibliografía a partir de la colección"; +"collections.download_attachments" = "Descargar adjuntos"; +"collections.delete_attachment_files" = "Eliminar descargas"; + +"sync_toolbar.starting" = "Inicio de la sincronización"; +"sync_toolbar.groups" = "Sincronización de grupos"; +"sync_toolbar.groups_with_data" = "Sincronización de grupos (%d / %d)"; +"sync_toolbar.library" = "Sincronizando %@"; +"sync_toolbar.object" = "Sincronizando %@ en %@"; +"sync_toolbar.object_with_data" = "Sincronizando %@ (%d / %d) en %@"; +"sync_toolbar.finished" = "Sincronización completada"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Error de sincronización (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "colecciones"; +"sync_toolbar.object.groups" = "grupos"; +"sync_toolbar.object.items" = "elementos"; +"sync_toolbar.object.searches" = "búsquedas"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Buscar elementos"; +"items.select_all" = "Seleccionar todo"; +"items.deselect_all" = "Deseleccionar todo"; +"items.sort_by" = "Ordenar por"; +"items.sort_order" = "Orden de clasificación"; +"items.ascending" = "Ascending"; +"items.descending" = "Descendiendo"; +"items.lookup" = "Añadir por identificador"; +"items.barcode" = "Escanear código de barras"; +"items.new" = "Añadir manualmente"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Añadir archivo"; +"items.remove_from_collection_title" = "Eliminar de la colección"; +"items.action.add_to_collection" = "Añadir a la colección"; +"items.action.remove_from_collection" = "Eliminar de la colección"; +"items.action.duplicate" = "Duplicar"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Descargar"; +"items.action.remove_download" = "Eliminar Descargar"; +"items.action.retrieve_metadata" = "Recuperar metadatos"; +"items.filters.title" = "Filtros"; +"items.filters.downloads" = "Archivos descargados"; +"items.filters.tags" = "Etiquetas"; +"items.toolbar_saved" = "Guardado %d / %d"; +"items.toolbar_downloaded" = "Descargado %d / %d"; +"items.generating_bib" = "Generando bibliografía"; +"items.creator_summary.and" = "%@ y %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Recuperación de metadatos"; + +"lookup.title" = "Introduzca los números ISBN, DOI, PMID, arXiv ID o ADS Bibcodes que desea añadir a su biblioteca:"; + +"citation.title" = "Vista previa de la cita"; +"citation.copy_citation" = "Copiar cita"; +"citation.copy_bibliography" = "Copiar bibligrafía"; +"citation.preview" = "Vista previa"; +"citation.omit_author" = "Omitir autor"; +"citation.locator_placeholder" = "Número"; +"citation.locator.page" = "Página"; +"citation.locator.book" = "Libro"; +"citation.locator.chapter" = "Capítulo"; +"citation.locator.column" = "Columna"; +"citation.locator.figure" = "Figura"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Número"; +"citation.locator.line" = "Línea"; +"citation.locator.note" = "Nota"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Párrafo"; +"citation.locator.part" = "Parte"; +"citation.locator.section" = "Sección"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volumen"; +"citation.locator.verse" = "Verso"; +"citation.style" = "Estilo"; +"citation.language" = "Idioma"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citas"; +"citation.bibliography" = "Bibliografía"; +"citation.notes" = "Notas"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Guardar como HTML"; +"citation.copy" = "Copiar a portapapeles"; + +"item_detail.add_creator" = "Añadir creador"; +"item_detail.notes" = "Notas"; +"item_detail.add_note" = "Añadir nota"; +"item_detail.tags" = "Etiquetas"; +"item_detail.add_tag" = "Añadir etiqueta"; +"item_detail.attachments" = "Adjuntos"; +"item_detail.add_attachment" = "Añadir adjunto"; +"item_detail.split_name" = "Dividir nombre"; +"item_detail.merge_name" = "Fusionar nombre"; +"item_detail.untitled" = "Título"; +"item_detail.show_more" = "Mostrar más"; +"item_detail.show_less" = "Mostrar menos"; +"item_detail.view_pdf" = "Ver PDF"; +"item_detail.data_reloaded" = "Este elemento se ha modificado de forma remota. Ahora se volverá a cargar."; +"item_detail.delete_attachment_file" = "Eliminar Descargar"; +"item_detail.deleted_title" = "Eliminado"; +"item_detail.deleted_message" = "Este elemento ha sido eliminado. ¿Desea restaurarlo?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d seleccionado"; +"tag_picker.placeholder" = "Nombre de etiqueta"; +"tag_picker.create_tag" = "Crear etiqueta “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deseleccionar todo"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Tipo de creador"; +"creator_editor.first_name" = "Nombre"; +"creator_editor.last_name" = "Apellido"; +"creator_editor.switch_to_single" = "Cambiar a un solo campo"; +"creator_editor.switch_to_dual" = "Cambiar a dos campos"; +"creator_editor.delete_confirmation" = "¿De verdad quieres eliminar este creador?"; + +"pdf.annotations_sidebar.search_title" = "Buscar"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Añadir etiquetas"; +"pdf.annotations_sidebar.merge" = "Fusionar"; +"pdf.annotations_sidebar.filter.title" = "Filtrar anotaciones"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Seleccionar etiquetas..."; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "La búsqueda no ha dado resultados"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Editar anotación"; +"pdf.annotation_popover.delete" = "Eliminar anotación"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Ancho"; +"pdf.annotation_popover.size" = "Tamaño"; +"pdf.deleted_title" = "Eliminado"; +"pdf.deleted_message" = "Este documento ha sido eliminado. ¿Desea restaurarlo?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Destacar"; +"pdf.underline" = "Subrayar"; +"pdf.annotation_share.image.share" = "Compartir imagen"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Grande"; +"pdf.annotation_toolbar.eraser" = "Goma de borrar"; +"pdf.annotation_toolbar.highlight" = "Destacar"; +"pdf.annotation_toolbar.note" = "Nota"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Subrayar"; +"pdf.annotation_toolbar.text" = "Texto"; +"pdf.locked.locked" = "Bloqueado"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Transición de página"; +"pdf.settings.page_transition.jump" = "Saltar"; +"pdf.settings.page_transition.continuous" = "Continuo"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automático"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Oscuro"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Modo de página"; +"pdf.settings.page_mode.single" = "Sencillo"; +"pdf.settings.page_mode.double" = "Doble"; +"pdf.settings.page_mode.automatic" = "Automático"; +"pdf.settings.page_fitting.title" = "Ajuste de página"; +"pdf.settings.page_fitting.fit" = "Ajustar"; +"pdf.settings.page_fitting.fill" = "Rellenar"; +"pdf.settings.page_spreads.title" = "Páginas dobles"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automático"; +"pdf.export.export" = "Exportar PDF"; +"pdf.export.export_annotated" = "Exportar PDF anotado"; +"pdf.sidebar.no_annotations" = "Sin anotaciones"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Página siguiente"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Ajustes"; +"settings.logout" = "Cerrar sesión"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Nunca"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Cuenta"; +"settings.sync.data_syncing" = "Sincronización de datos"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Cuenta"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Eliminar cuenta"; +"settings.sync.username" = "Nombre de usuario"; +"settings.sync.password" = "Contraseña"; +"settings.sync.verify" = "Verificar servidor"; +"settings.sync.directory_not_found.title" = "Directorio no encontrado"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verificado"; +"settings.permission" = "Permiso de usuario"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Traductores"; +"settings.translators_update" = "Actualizar traductores"; +"settings.translators_updating" = "Actualizando..."; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Iniciar sesión"; +"settings.start_logging" = "Comenzar iniciar sesión"; +"settings.start_logging_on_launch" = "Iniciar sesión en el próximo inicio de la aplicación"; +"settings.cancel_logging" = "Cancelar iniciar sesión"; +"settings.stop_logging" = "Parar iniciar sesión"; +"settings.view_output" = "Ver salida"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Enviar manualmente"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copiar a portapapeles"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Conectado"; +"settings.websocket_connecting" = "Conectando"; +"settings.websocket_disconnected" = "Desconectado"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Guardar archivos"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Copia rápida"; +"settings.export.default_format" = "Formato predeterminado"; +"settings.export.language" = "Idioma"; +"settings.export.copy_as_html" = "Copiar como HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Herramientas de anotación"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Restablecer"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Cargando colecciones"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Elemento"; +"shareext.collection_title" = "Colección"; +"shareext.tags_title" = "Etiquetas"; + +"searchbar.placeholder" = "Buscar"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Error desconocido"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "el archivo"; +"errors.login.invalid_password" = "Contraseña no válida"; +"errors.login.invalid_username" = "Nombre de usuario inválido"; +"errors.login.invalid_credentials" = "Nombre de usuario o contraseña no válidos"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Introduzca un nombre para la colección"; +"errors.collections.save_failed" = "No se puede guardar la colección"; +"errors.collections.bibliography_failed" = "No se pudieron cargar los elementos para la bibliografía"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Volver al original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Saltar grupo"; +"errors.sync_toolbar.finished_with_errors" = "Sincronización completada (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "No tienes permiso para editar grupos."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Cuota alcanzada."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Mostrar elemento"; +"errors.sync_toolbar.show_items" = "Mostrar elementos"; +"errors.sync_toolbar.forbidden" = "Nombre de usuario o contraseña no válidos"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "No se pudo guardar la nota."; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "No se pudieron crear los archivos adjuntos"; +"errors.item_detail.cant_save_note" = "No se pudo guardar la nota."; +"errors.item_detail.cant_save_changes" = "No se pudieron guardar los cambios"; +"errors.item_detail.cant_trash_item" = "No se pudo mover el elemento a la papelera"; +"errors.item_detail.cant_save_tags" = "No se pudieron guardar las etiquetas"; +"errors.item_detail.unsupported_type" = "El tipo \"%@\" no es compatible"; +"errors.settings.storage" = "No se pudieron recopilar los datos de almacenamiento."; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_password" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_url" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_username" = "Error de verificación de WebDAV"; +"errors.settings.webdav.non_existent_file_not_missing" = "Error de verificación de WebDAV"; +"errors.settings.webdav.not_dav" = "URL WebDAV no válida"; +"errors.settings.webdav.parent_dir_not_found" = "Error de verificación de WebDAV"; +"errors.settings.webdav.zotero_dir_not_found" = "Error de verificación de WebDAV"; +"errors.settings.webdav.unauthorized" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que introdujo."; +"errors.settings.webdav.forbidden" = "No tiene permiso para acceder a la carpeta especificada en el servidor WebDAV."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Error al guardar"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "Error de verificación de WebDAV"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Error de depuración"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Abrir ajustes"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Título"; +"accessibility.locked" = "Bloqueado"; +"accessibility.archived" = "Archivado"; +"accessibility.collections.items" = "elementos"; +"accessibility.collections.expand" = "Ampliar"; +"accessibility.collections.collapse" = "Contraer"; +"accessibility.collections.create_collection" = "Crear colección"; +"accessibility.collections.search_collections" = "Buscar colecciones"; +"accessibility.collections.expand_all_collections" = "Expandir todas las colecciones"; +"accessibility.items.open_item" = "Abrir información del elemento"; +"accessibility.items.select_items" = "Seleccionar elementos"; +"accessibility.items.select_all_items" = "Seleccionar todos los elementos"; +"accessibility.items.deselect_all_items" = "Deseleccionar todos los elementos"; +"accessibility.items.filter_items" = "Filtrar elementos"; +"accessibility.items.sort_items" = "Ordenar elementos"; +"accessibility.items.add_to_collection" = "Añadir elementos seleccionados a la colección"; +"accessibility.items.remove_from_collection" = "Eliminar elementos seleccionados de la colección"; +"accessibility.items.trash" = "Mover elementos seleccionados a la papelera"; +"accessibility.items.delete" = "Eliminar elementos seleccionados"; +"accessibility.items.restore" = "Restaurar elementos seleccionados"; +"accessibility.items.duplicate" = "Duplicar elemento seleccionado"; +"accessibility.items.share" = "Compartir elementos seleccionados"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Colección"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Abrir barra lateral"; +"accessibility.pdf.sidebar_close" = "Cerrar barra lateral"; +"accessibility.pdf.share" = "Compartir PDF"; +"accessibility.pdf.export" = "Exportar PDF"; +"accessibility.pdf.export_annotated" = "Export PDF anotado"; +"accessibility.pdf.settings" = "Ajustes"; +"accessibility.pdf.color_picker" = "Selector de color"; +"accessibility.pdf.highlight_annotation_tool" = "Crear anotación de resaltado"; +"accessibility.pdf.note_annotation_tool" = "Crear anotación de nota"; +"accessibility.pdf.image_annotation_tool" = "Crear anotación de imagen"; +"accessibility.pdf.ink_annotation_tool" = "Crear anotación con tinta"; +"accessibility.pdf.underline_annotation_tool" = "Crear anotación de subrayado"; +"accessibility.pdf.text_annotation_tool" = "Crear anotación de texto"; +"accessibility.pdf.eraser_annotation_tool" = "Goma de borrar"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Editar anotación"; +"accessibility.pdf.share_annotation" = "Compartir anotación"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Goma de borrar"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Autor"; +"accessibility.pdf.comment" = "Comentario"; +"accessibility.pdf.tags" = "Etiquetas"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Seleccionados"; +"accessibility.pdf.search_pdf" = "Buscar PDF"; +"accessibility.pdf.redo" = "Rehacer"; +"accessibility.pdf.undo" = "Deshacer"; +"accessibility.pdf.toggle_annotation_toolbar" = "Alternar barra de herramientas de anotaciones"; +"accessibility.pdf.show_more_tools" = "Mostrar más"; +"accessibility.htmlepub.search_html" = "Buscar sitio web"; +"accessibility.htmlepub.search_epub" = "Buscar EPUB"; +"accessibility.speech.play" = "Empieza a hablar"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Empieza a leer en voz alta"; +"accessibility.open_document_accessibility" = "Abrir opciones de accesibilidad"; diff --git a/Zotero/Assets/es-AR.lproj/Localizable.stringsdict b/Zotero/Assets/es-AR.lproj/Localizable.stringsdict new file mode 100644 index 000000000..63bcf885a --- /dev/null +++ b/Zotero/Assets/es-AR.lproj/Localizable.stringsdict @@ -0,0 +1,239 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Colección seleccionada + many + %d Colecciones seleccionadas + other + %d Colecciones seleccionadas + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar el elemento seleccionado? + many + ¿Estás seguro que quieres eliminar los elementos seleccionados? + other + ¿Estás seguro que quieres eliminar los elementos seleccionados? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar el elemento seleccionado de esta colección? + many + ¿Estás seguro que quieres eliminar los elementos seleccionados de esta colección? + other + ¿Estás seguro que quieres eliminar los elementos seleccionados de esta colección? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filtro: 1 elemento + many + Filtro: %d elementos + other + Filtro: %d elementos + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Se encontró 1 coincidencia + many + Se encontraron %d coincidencias + other + Se encontraron %d coincidencias + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 archivo (%.2f %@) + many + %d archivos (%.2f %@) + other + %d archivos (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %d problema + many + %d problemas + other + %d problemas + + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 etiqueta seleccionada + many + %d etiquetas seleccionadas + other + %d etiquetas seleccionadas + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar 1 etiqueta automática en esta librería?\n\nEsta acción no se puede deshacer. + many + ¿Estás seguro que quieres eliminar %d etiquetas automáticas en esta librería?\n\nEsta acción no se puede deshacer. + other + ¿Estás seguro que quieres eliminar %d etiquetas automáticas en esta librería?\n\nEsta acción no se puede deshacer. + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 línea registrada + many + %d líneas registradas + other + %d líneas registradas + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 línea + many + %d líneas + other + %d líneas + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + No se pudo eliminar 1 archivo de tu servidor WebDAV + many + No se pudieron eliminar %d archivos de tu servidor WebDAV + other + No se pudieron eliminar %d archivos de tu servidor WebDAV + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Después de 1 día + many + Después de %d días + other + Después de %d días + + + + diff --git a/Zotero/Assets/es.lproj/InfoPList.strings b/Zotero/Assets/es.lproj/InfoPList.strings new file mode 100644 index 000000000..434286abc --- /dev/null +++ b/Zotero/Assets/es.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Mi biblioteca"; diff --git a/Zotero/Assets/es.lproj/Localizable.strings b/Zotero/Assets/es.lproj/Localizable.strings new file mode 100644 index 000000000..9bea0ed3b --- /dev/null +++ b/Zotero/Assets/es.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Cerrar"; +"delete" = "Eliminar"; +"edit" = "Editar"; +"last_updated" = "Última actualización"; +"name" = "Nombre"; +"save" = "Guardar"; +"creator" = "Creador"; +"date" = "Fecha"; +"date_added" = " Fecha de adición"; +"date_modified" = "Fecha de modificación"; +"item_type" = "Tipo de elemento"; +"publication_title" = "Título de publicación"; +"publisher" = "Editorial"; +"title" = "Título"; +"year" = "Año"; +"abstract" = "Resumen"; +"error" = "Error"; +"warning" = "Alerta"; +"yes" = "Sí"; +"no" = "No"; +"cancel" = "Cancelar"; +"done" = "Hecho"; +"ok" = "Ok"; +"add" = "Añadir"; +"unknown" = "Desconocido"; +"retry" = "Reintentar"; +"page" = "Página"; +"report" = "Informe"; +"total" = "Total"; +"restore" = "Restaurar"; +"copy" = "Copiar"; +"privacy_policy" = "Política de privacidad"; +"support_feedback" = "Soporte y comentarios"; +"about_zotero" = "Sobre Zotero"; +"recent" = "Recientes"; +"look_up" = "Buscar"; +"not_found" = "No encontrado"; +"share" = "Compartir"; +"select" = "Seleccionar"; +"create" = "Crear"; +"more_information" = "Más información"; +"clear" = "Limpiar"; +"scan_text" = "Escanear texto"; +"move_to_trash" = "Mover a la papelera"; +"size" = "Tamaño"; +"remove" = "Borrar"; +"keep" = "Mantener"; +"cancel_all" = "Cancelar todo"; +"back" = "Volver"; +"forward" = "Adelante"; +"go_to_settings" = "Ir a ajustes"; +"close_without_saving" = "Cerrar sin guardar"; +"stay" = "Permanecer"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organiza la investigación como usted desee. Clasifique sus elementos en colecciones y etiquételos con palabras clave."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Acceder"; +"onboarding.create_account" = "Registrarse"; +"login.username" = "Nombre de usuario"; +"login.password" = "Contraseña"; +"login.email" = "Correo electrónico"; +"login.repeat_password" = "Repetir contraseña"; +"login.forgot_password" = "¿Olvidó su contraseña?"; + +"libraries.my_library" = "Mi biblioteca"; +"libraries.group_libraries" = "Bibliotecas de grupo"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Buscar colección"; +"collections.all_items" = "Todos los elementos"; +"collections.my_publications" = "Mis publicaciones"; +"collections.trash" = "Papelera"; +"collections.unfiled" = "Elementos sin archivar"; +"collections.new_subcollection" = "Nueva subcolección"; +"collections.edit_title" = "Editar colección"; +"collections.delete" = "Eliminar colección"; +"collections.delete_with_items" = "Eliminar colección y elementos"; +"collections.create_title" = "Crear colección"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Vaciar la papelera"; +"collections.collapse_all" = "Contraer todo"; +"collections.expand_all" = "Expandir todo"; +"collections.create_bibliography" = "Crear bibliografía a partir de la colección"; +"collections.download_attachments" = "Descargar adjuntos"; +"collections.delete_attachment_files" = "Eliminar descargas"; + +"sync_toolbar.starting" = "Inicio de la sincronización"; +"sync_toolbar.groups" = "Sincronizando grupos"; +"sync_toolbar.groups_with_data" = "Sincronizando grupos (%d / %d)"; +"sync_toolbar.library" = "Sincronizando %@"; +"sync_toolbar.object" = "Sincronizando %@ en %@"; +"sync_toolbar.object_with_data" = "Sincronizando %@ (%d / %d) en %@"; +"sync_toolbar.finished" = "Sincronización completada"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Error de sincronización (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "colecciones"; +"sync_toolbar.object.groups" = "grupos"; +"sync_toolbar.object.items" = "elementos"; +"sync_toolbar.object.searches" = "búsquedas"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Buscar elementos"; +"items.select_all" = "Seleccionar todo"; +"items.deselect_all" = "Deseleccionar todo"; +"items.sort_by" = "Ordenar por"; +"items.sort_order" = "Orden de clasificación"; +"items.ascending" = "Ascending"; +"items.descending" = "Descendiendo"; +"items.lookup" = "Añadir por identificador"; +"items.barcode" = "Escanear código de barras"; +"items.new" = "Añadir manualmente"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Añadir archivo"; +"items.remove_from_collection_title" = "Eliminar de la colección"; +"items.action.add_to_collection" = "Añadir a la colección"; +"items.action.remove_from_collection" = "Eliminar de la colección"; +"items.action.duplicate" = "Duplicar"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Descargar"; +"items.action.remove_download" = "Eliminar descarga"; +"items.action.retrieve_metadata" = "Recuperar metadatos"; +"items.filters.title" = "Filtros"; +"items.filters.downloads" = "Archivos descargados"; +"items.filters.tags" = "Etiquetas"; +"items.toolbar_saved" = "Guardado %d / %d"; +"items.toolbar_downloaded" = "Descargado %d / %d"; +"items.generating_bib" = "Generando bibliografía"; +"items.creator_summary.and" = "%@ y %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Recuperación de metadatos"; + +"lookup.title" = "Introduzca los números ISBN, DOI, PMID, arXiv ID o ADS Bibcodes que desea añadir a su biblioteca:"; + +"citation.title" = "Vista previa de la cita"; +"citation.copy_citation" = "Copiar cita"; +"citation.copy_bibliography" = "Copiar bibligrafía"; +"citation.preview" = "Vista previa"; +"citation.omit_author" = "Omitir autor"; +"citation.locator_placeholder" = "Número"; +"citation.locator.page" = "Página"; +"citation.locator.book" = "Libro"; +"citation.locator.chapter" = "Capítulo"; +"citation.locator.column" = "Columna"; +"citation.locator.figure" = "Figura"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Número"; +"citation.locator.line" = "Línea"; +"citation.locator.note" = "Nota"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Párrafo"; +"citation.locator.part" = "Parte"; +"citation.locator.section" = "Sección"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volumen"; +"citation.locator.verse" = "Verso"; +"citation.style" = "Estilo"; +"citation.language" = "Idioma"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citas"; +"citation.bibliography" = "Bibliografía"; +"citation.notes" = "Notas"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Guardar como HTML"; +"citation.copy" = "Copiar a portapapeles"; + +"item_detail.add_creator" = "Añadir creador"; +"item_detail.notes" = "Notas"; +"item_detail.add_note" = "Añadir nota"; +"item_detail.tags" = "Etiquetas"; +"item_detail.add_tag" = "Añadir etiqueta"; +"item_detail.attachments" = "Adjuntos"; +"item_detail.add_attachment" = "Añadir adjunto"; +"item_detail.split_name" = "Dividir nombre"; +"item_detail.merge_name" = "Fusionar nombre"; +"item_detail.untitled" = "Título"; +"item_detail.show_more" = "Mostrar más"; +"item_detail.show_less" = "Mostrar menos"; +"item_detail.view_pdf" = "Ver PDF"; +"item_detail.data_reloaded" = "Este elemento se ha modificado de forma remota. Ahora se volverá a cargar."; +"item_detail.delete_attachment_file" = "Eliminar descarga"; +"item_detail.deleted_title" = "Eliminado"; +"item_detail.deleted_message" = "Este elemento ha sido eliminado. ¿Desea restaurarlo?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d seleccionado"; +"tag_picker.placeholder" = "Nombre de etiqueta"; +"tag_picker.create_tag" = "Crear etiqueta “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deseleccionar todo"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Tipo de creador"; +"creator_editor.first_name" = "Nombre"; +"creator_editor.last_name" = "Apellido"; +"creator_editor.switch_to_single" = "Cambiar a un solo campo"; +"creator_editor.switch_to_dual" = "Cambiar a dos campos"; +"creator_editor.delete_confirmation" = "¿De verdad quieres eliminar este creador?"; + +"pdf.annotations_sidebar.search_title" = "Buscar"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Añadir etiquetas"; +"pdf.annotations_sidebar.merge" = "Fusionar"; +"pdf.annotations_sidebar.filter.title" = "Filtrar anotaciones"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Seleccionar etiquetas..."; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "La búsqueda no ha dado resultados"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Editar anotación"; +"pdf.annotation_popover.delete" = "Eliminar anotación"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Ancho"; +"pdf.annotation_popover.size" = "Tamaño"; +"pdf.deleted_title" = "Eliminado"; +"pdf.deleted_message" = "Este documento ha sido eliminado. ¿Desea restaurarlo?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Destacar"; +"pdf.underline" = "Subrayar"; +"pdf.annotation_share.image.share" = "Compartir imagen"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Grande"; +"pdf.annotation_toolbar.eraser" = "Goma de borrar"; +"pdf.annotation_toolbar.highlight" = "Destacar"; +"pdf.annotation_toolbar.note" = "Nota"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Subrayar"; +"pdf.annotation_toolbar.text" = "Texto"; +"pdf.locked.locked" = "Bloqueado"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Transición de página"; +"pdf.settings.page_transition.jump" = "Saltar"; +"pdf.settings.page_transition.continuous" = "Continuo"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automático"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Oscuro"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Modo de página"; +"pdf.settings.page_mode.single" = "Sencillo"; +"pdf.settings.page_mode.double" = "Doble"; +"pdf.settings.page_mode.automatic" = "Automático"; +"pdf.settings.page_fitting.title" = "Ajuste de página"; +"pdf.settings.page_fitting.fit" = "Ajustar"; +"pdf.settings.page_fitting.fill" = "Rellenar"; +"pdf.settings.page_spreads.title" = "Páginas dobles"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automático"; +"pdf.export.export" = "Exportar PDF"; +"pdf.export.export_annotated" = "Exportar PDF anotado"; +"pdf.sidebar.no_annotations" = "Sin anotaciones"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Página siguiente"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Ajustes"; +"settings.logout" = "Cerrar sesión"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Nunca"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Cuenta"; +"settings.sync.data_syncing" = "Sincronización de datos"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Cuenta"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Eliminar cuenta"; +"settings.sync.username" = "Nombre de usuario"; +"settings.sync.password" = "Contraseña"; +"settings.sync.verify" = "Verificar servidor"; +"settings.sync.directory_not_found.title" = "Directorio no encontrado"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verificado"; +"settings.permission" = "Permiso de usuario"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Traductores"; +"settings.translators_update" = "Actualizar traductores"; +"settings.translators_updating" = "Actualizando..."; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Iniciar sesión"; +"settings.start_logging" = "Comenzar iniciar sesión"; +"settings.start_logging_on_launch" = "Iniciar sesión en el próximo inicio de la aplicación"; +"settings.cancel_logging" = "Cancelar iniciar sesión"; +"settings.stop_logging" = "Parar iniciar sesión"; +"settings.view_output" = "Ver salida"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Enviar manualmente"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copiar a portapapeles"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Conectado"; +"settings.websocket_connecting" = "Conectando"; +"settings.websocket_disconnected" = "Desconectado"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Guardar archivos"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Copia rápida"; +"settings.export.default_format" = "Formato predeterminado"; +"settings.export.language" = "Idioma"; +"settings.export.copy_as_html" = "Copiar como HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Herramientas de anotación"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Restablecer"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Cargando colecciones"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Elemento"; +"shareext.collection_title" = "Colección"; +"shareext.tags_title" = "Etiquetas"; + +"searchbar.placeholder" = "Buscar"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Error desconocido"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "el archivo"; +"errors.login.invalid_password" = "Contraseña no válida"; +"errors.login.invalid_username" = "Nombre de usuario no válido"; +"errors.login.invalid_credentials" = "Nombre de usuario o contraseña no válidos"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Introduzca un nombre para la colección"; +"errors.collections.save_failed" = "No se puede guardar la colección"; +"errors.collections.bibliography_failed" = "No se pudieron cargar los elementos para la bibliografía"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Volver al original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Saltar grupo"; +"errors.sync_toolbar.finished_with_errors" = "Sincronización completada (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "No tienes permiso para editar grupos."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Cuota alcanzada."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Mostrar elemento"; +"errors.sync_toolbar.show_items" = "Mostrar elementos"; +"errors.sync_toolbar.forbidden" = "Nombre de usuario o contraseña no válidos"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "No se pudo guardar la nota."; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "No se pudieron crear los archivos adjuntos"; +"errors.item_detail.cant_save_note" = "No se pudo guardar la nota"; +"errors.item_detail.cant_save_changes" = "No se pudieron guardar los cambios"; +"errors.item_detail.cant_trash_item" = "No se pudo mover el elemento a la papelera"; +"errors.item_detail.cant_save_tags" = "No se pudieron guardar las etiquetas"; +"errors.item_detail.unsupported_type" = "El tipo \"%@\" no es compatible"; +"errors.settings.storage" = "No se pudieron recopilar los datos de almacenamiento"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_password" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_url" = "Error de verificación de WebDAV"; +"errors.settings.webdav.no_username" = "Error de verificación de WebDAV"; +"errors.settings.webdav.non_existent_file_not_missing" = "Error de verificación de WebDAV"; +"errors.settings.webdav.not_dav" = "URL WebDAV no válida"; +"errors.settings.webdav.parent_dir_not_found" = "Error de verificación de WebDAV"; +"errors.settings.webdav.zotero_dir_not_found" = "Error de verificación de WebDAV"; +"errors.settings.webdav.unauthorized" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que introdujo."; +"errors.settings.webdav.forbidden" = "No tiene permiso para acceder a la carpeta especificada en el servidor WebDAV."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Error al guardar"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "Error de verificación de WebDAV"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Error de depuración"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Abrir ajustes"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Título"; +"accessibility.locked" = "Bloqueado"; +"accessibility.archived" = "Archivado"; +"accessibility.collections.items" = "elementos"; +"accessibility.collections.expand" = "Ampliar"; +"accessibility.collections.collapse" = "Contraer"; +"accessibility.collections.create_collection" = "Crear colección"; +"accessibility.collections.search_collections" = "Buscar colecciones"; +"accessibility.collections.expand_all_collections" = "Expandir todas las colecciones"; +"accessibility.items.open_item" = "Abrir información del elemento"; +"accessibility.items.select_items" = "Seleccionar elementos"; +"accessibility.items.select_all_items" = "Seleccionar todos los elementos"; +"accessibility.items.deselect_all_items" = "Deseleccionar todos los elementos"; +"accessibility.items.filter_items" = "Filtrar elementos"; +"accessibility.items.sort_items" = "Ordenar elementos"; +"accessibility.items.add_to_collection" = "Añadir elementos seleccionados a la colección"; +"accessibility.items.remove_from_collection" = "Eliminar elementos seleccionados de la colección"; +"accessibility.items.trash" = "Mover elementos seleccionados a la papelera"; +"accessibility.items.delete" = "Eliminar elementos seleccionados"; +"accessibility.items.restore" = "Restaurar elementos seleccionados"; +"accessibility.items.duplicate" = "Duplicar elemento seleccionado"; +"accessibility.items.share" = "Compartir elementos seleccionados"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Colección"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Abrir barra lateral"; +"accessibility.pdf.sidebar_close" = "Cerrar barra lateral"; +"accessibility.pdf.share" = "Compartir PDF"; +"accessibility.pdf.export" = "Exportar PDF"; +"accessibility.pdf.export_annotated" = "Export PDF anotado"; +"accessibility.pdf.settings" = "Ajustes"; +"accessibility.pdf.color_picker" = "Selector de color"; +"accessibility.pdf.highlight_annotation_tool" = "Crear anotación de resaltado"; +"accessibility.pdf.note_annotation_tool" = "Crear anotación de nota"; +"accessibility.pdf.image_annotation_tool" = "Crear anotación de imagen"; +"accessibility.pdf.ink_annotation_tool" = "Crear anotación con tinta"; +"accessibility.pdf.underline_annotation_tool" = "Crear anotación de subrayado"; +"accessibility.pdf.text_annotation_tool" = "Crear anotación de texto"; +"accessibility.pdf.eraser_annotation_tool" = "Goma de borrar"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Editar anotación"; +"accessibility.pdf.share_annotation" = "Compartir anotación"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Goma de borrar"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Autor"; +"accessibility.pdf.comment" = "Comentario"; +"accessibility.pdf.tags" = "Etiquetas"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Seleccionados"; +"accessibility.pdf.search_pdf" = "Buscar PDF"; +"accessibility.pdf.redo" = "Rehacer"; +"accessibility.pdf.undo" = "Deshacer"; +"accessibility.pdf.toggle_annotation_toolbar" = "Alternar barra de herramientas de anotaciones"; +"accessibility.pdf.show_more_tools" = "Mostrar más"; +"accessibility.htmlepub.search_html" = "Buscar sitio web"; +"accessibility.htmlepub.search_epub" = "Buscar EPUB"; +"accessibility.speech.play" = "Empieza a hablar"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Empieza a leer en voz alta"; +"accessibility.open_document_accessibility" = "Abrir opciones de accesibilidad"; diff --git a/Zotero/Assets/es.lproj/Localizable.stringsdict b/Zotero/Assets/es.lproj/Localizable.stringsdict new file mode 100644 index 000000000..2191baeb9 --- /dev/null +++ b/Zotero/Assets/es.lproj/Localizable.stringsdict @@ -0,0 +1,239 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Colección seleccionada + many + %d Colecciones seleccionadas + other + %d Colecciones seleccionadas + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar el elemento seleccionado? + many + ¿Estás seguro que quieres eliminar los elementos seleccionados? + other + ¿Estás seguro que quieres eliminar los elementos seleccionados? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar el elemento seleccionado de esta colección? + many + ¿Estás seguro que quieres eliminar los elementos seleccionados de esta colección? + other + ¿Estás seguro que quieres eliminar los elementos seleccionados de esta colección? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filtro: 1 elemento + many + Filtro: %d elementos + other + Filtro: %d elementos + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Se encontró 1 coincidencia + many + Se encontraron %d coincidencias + other + Se encontraron %d coincidencias + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 archivo (%.2f %@) + many + %d archivos (%.2f %@) + other + %d archivos (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 problema + many + %d problemas + other + %d problemas + + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 etiqueta seleccionada + many + %d etiquetas seleccionadas + other + %d etiquetas seleccionadas + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + ¿Estás seguro que quieres eliminar 1 etiqueta automática en esta librería?\n\nEsta acción no se puede deshacer. + many + ¿Estás seguro que quieres eliminar %d etiquetas automáticas en esta librería?\n\nEsta acción no se puede deshacer. + other + ¿Estás seguro que quieres eliminar %d etiquetas automáticas en esta librería?\n\nEsta acción no se puede deshacer. + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 línea registrada + many + %d líneas registradas + other + %d líneas registradas + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 línea + many + %d líneas + other + %d líneas + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + No se pudo eliminar 1 archivo de tu servidor WebDAV + many + No se pudieron eliminar %d archivos de tu servidor WebDAV + other + No se pudieron eliminar %d archivos de tu servidor WebDAV + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Después de 1 día + many + Después de %d días + other + Después de %d días + + + + diff --git a/Zotero/Assets/et.lproj/InfoPList.strings b/Zotero/Assets/et.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/et.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/et.lproj/Localizable.strings b/Zotero/Assets/et.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/et.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/et.lproj/Localizable.stringsdict b/Zotero/Assets/et.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/et.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/eu.lproj/InfoPList.strings b/Zotero/Assets/eu.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/eu.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/eu.lproj/Localizable.strings b/Zotero/Assets/eu.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/eu.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/eu.lproj/Localizable.stringsdict b/Zotero/Assets/eu.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/eu.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/fa.lproj/InfoPList.strings b/Zotero/Assets/fa.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/fa.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/fa.lproj/Localizable.strings b/Zotero/Assets/fa.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/fa.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/fa.lproj/Localizable.stringsdict b/Zotero/Assets/fa.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/fa.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/fi.lproj/InfoPList.strings b/Zotero/Assets/fi.lproj/InfoPList.strings new file mode 100644 index 000000000..07ca6256d --- /dev/null +++ b/Zotero/Assets/fi.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Oma kirjasto"; diff --git a/Zotero/Assets/fi.lproj/Localizable.strings b/Zotero/Assets/fi.lproj/Localizable.strings new file mode 100644 index 000000000..bca55bb75 --- /dev/null +++ b/Zotero/Assets/fi.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "Oma kirjasto"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/fi.lproj/Localizable.stringsdict b/Zotero/Assets/fi.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/fi.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/fr.lproj/InfoPList.strings b/Zotero/Assets/fr.lproj/InfoPList.strings new file mode 100644 index 000000000..f2e3d36ca --- /dev/null +++ b/Zotero/Assets/fr.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Ma bibliothèque"; diff --git a/Zotero/Assets/fr.lproj/Localizable.strings b/Zotero/Assets/fr.lproj/Localizable.strings new file mode 100644 index 000000000..904bd4d87 --- /dev/null +++ b/Zotero/Assets/fr.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Fermer"; +"delete" = "Supprimer"; +"edit" = "Modifier"; +"last_updated" = "Dernière mise à jour"; +"name" = "Nom"; +"save" = "Enregistrer"; +"creator" = "Créateur"; +"date" = "Date"; +"date_added" = "Date d'ajout"; +"date_modified" = "Date de modification"; +"item_type" = "Type de document"; +"publication_title" = "Titre de la publication"; +"publisher" = "Maison d’édition"; +"title" = "Titre"; +"year" = "Année"; +"abstract" = "Résumé"; +"error" = "Erreur"; +"warning" = "Avertissement"; +"yes" = "Oui"; +"no" = "Non"; +"cancel" = "Annuler"; +"done" = "Fait"; +"ok" = "OK"; +"add" = "Ajouter"; +"unknown" = "Inconnu"; +"retry" = "Essayer à nouveau"; +"page" = "Page"; +"report" = "Rapport"; +"total" = "Total"; +"restore" = "Restaurer"; +"copy" = "Copier"; +"privacy_policy" = "Politique de confidentialité"; +"support_feedback" = "Assistance et commentaires"; +"about_zotero" = "A propos de Zotero"; +"recent" = "Récents"; +"look_up" = "Recherche"; +"not_found" = "Non trouvé"; +"share" = "Partager"; +"select" = "Sélectionner"; +"create" = "Créer"; +"more_information" = "Plus d'informations"; +"clear" = "Effacer"; +"scan_text" = "Analyser le texte"; +"move_to_trash" = "Mettre à la corbeille"; +"size" = "Taille"; +"remove" = "Supprimer"; +"keep" = "Garder"; +"cancel_all" = "Tout annuler"; +"back" = " Retour"; +"forward" = "Suivant"; +"go_to_settings" = "Aller aux paramètres"; +"close_without_saving" = "Fermer sans enregistrer"; +"stay" = "Rester"; + +"migration_debug" = "L'application n'a pas pu s'initialiser et ne fonctionne pas correctement. Veuillez signaler le Debug ID %@ sur les forums Zotero."; +"login_debug" = "L'application n'a pas réussi à se connecter. Veuillez vous connecter à nouveau et signaler le Debug ID %@ sur les forums Zotero."; +"full_sync_debug" = "La synchronisation complète est terminée. Veuillez signaler le Debug ID %@ sur les forums Zotero."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organise votre recherche comme vous le voulez. Classez vos documents dans des collections et marquez les avec des mots-clés."; +"onboarding.sync" = "Syncronisez et collaborez sur de multiples appareils, pour garder facilement à jour votre lecture et vos notes."; +"onboarding.annotate" = "Surlignez et prenez des notes directement dans vos PDFs pendant que vous les lisez."; +"onboarding.share" = "Appuyer pour collecter des articles et des livres directement depuis le Web, y compris leurs fichiers PDF et toutes leurs métadonnées. "; +"onboarding.sign_in" = "Se connecter"; +"onboarding.create_account" = "S'enregistrer"; +"login.username" = "Nom d'utilisateur"; +"login.password" = "Mot de passe"; +"login.email" = "Courriel"; +"login.repeat_password" = "Répéter le mot de passe"; +"login.forgot_password" = "Mot de passe oublié?"; + +"libraries.my_library" = "Ma bibliothèque"; +"libraries.group_libraries" = "Bibliothèques de groupe"; +"libraries.delete_question" = "Voulez-vous vraiment supprimer “%@”?"; + +"collections.search_title" = "Trouver la collection"; +"collections.all_items" = "Tous les documents"; +"collections.my_publications" = "Mes publications"; +"collections.trash" = "Corbeille"; +"collections.unfiled" = "Documents non classés"; +"collections.new_subcollection" = "Nouvelle sous-collection"; +"collections.edit_title" = "Modifier la collection"; +"collections.delete" = "Supprimer la collection"; +"collections.delete_with_items" = "Supprimer la collection et ses documents"; +"collections.create_title" = "Créer une collection"; +"collections.picker_title" = "Choisir le document parent"; +"collections.empty_trash" = "Vider la corbeille"; +"collections.collapse_all" = "Tout réduire"; +"collections.expand_all" = "Tout développer"; +"collections.create_bibliography" = "Créer une bibliographie à partir de la collection"; +"collections.download_attachments" = "Télécharger les pièces jointes"; +"collections.delete_attachment_files" = "Supprimer les téléchargements"; + +"sync_toolbar.starting" = "Début de la synchronisation"; +"sync_toolbar.groups" = "Synchronisation des groupes"; +"sync_toolbar.groups_with_data" = "Synchronisation des groupes (%d / %d)"; +"sync_toolbar.library" = "Synchronisation de %@"; +"sync_toolbar.object" = "Synchronisation de %@ dans %@"; +"sync_toolbar.object_with_data" = "Synchronisation de %@ (%d / %d) dans %@"; +"sync_toolbar.finished" = "Synchronisation terminée"; +"sync_toolbar.deletion" = "Application des suppressions à distance dans %@"; +"sync_toolbar.aborted" = "Échec de la synchronisation (%@)"; +"sync_toolbar.writes" = "Téléchargement des modifications (%d / %d)"; +"sync_toolbar.uploads" = "Téléchargement des pièces jointes (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groupes"; +"sync_toolbar.object.items" = "documents"; +"sync_toolbar.object.searches" = "recherches"; + +"sync.conflict_resolution.changed_item_deleted" = "Le document “%@” a été supprimé. Voulez-vous conserver vos modifications ?"; + +"items.search_title" = "Rechercher dans les documents"; +"items.select_all" = "Tout sélectionner"; +"items.deselect_all" = "Tout désélectionner"; +"items.sort_by" = "Trier par"; +"items.sort_order" = "Critère de tri"; +"items.ascending" = "Ascendant"; +"items.descending" = "Descendant"; +"items.lookup" = "Ajouter par un identifiant"; +"items.barcode" = "Lire le code-barres"; +"items.new" = "Ajouter manuellement"; +"items.new_note" = "Nouvelle note indépendante"; +"items.new_file" = "Ajouter un fichier"; +"items.remove_from_collection_title" = "Retirer de la collection"; +"items.action.add_to_collection" = "Ajouter à la collection"; +"items.action.remove_from_collection" = "Retirer de la collection"; +"items.action.duplicate" = "Dupliquer"; +"items.action.create_parent" = "Créer un document parent"; +"items.action.download" = "Télécharger"; +"items.action.remove_download" = "Supprimer le téléchargement"; +"items.action.retrieve_metadata" = " Récupérer les métadonnées"; +"items.filters.title" = "Filtres"; +"items.filters.downloads" = "Fichiers téléchargés"; +"items.filters.tags" = "Marqueurs"; +"items.toolbar_saved" = "%d / %d enregistré"; +"items.toolbar_downloaded" = "%d / %d téléchargé"; +"items.generating_bib" = "Génération de la bibliographie"; +"items.creator_summary.and" = "%@ et %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Récupération des métadonnées"; + +"lookup.title" = "Entrer des ISBN, DOI, PMID, arXiv ID ou bibcodes ADS à ajouter à votre bibliothèque:"; + +"citation.title" = "Aperçu de la citation"; +"citation.copy_citation" = "Copier la citation"; +"citation.copy_bibliography" = "Copier la bibliographie"; +"citation.preview" = "Aperçu"; +"citation.omit_author" = "Ignorer l'auteur"; +"citation.locator_placeholder" = "Numéro identifiant"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Livre"; +"citation.locator.chapter" = "Chapitre"; +"citation.locator.column" = "Colonne"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Numéro"; +"citation.locator.line" = "Ligne"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraphe"; +"citation.locator.part" = "Partie"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verset"; +"citation.style" = "Style"; +"citation.language" = "Langue"; +"citation.output_mode" = "Mode de création"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliographie"; +"citation.notes" = "Notes"; +"citation.output_method" = "Méthode de création"; +"citation.save_html" = "Enregistrer en HTML"; +"citation.copy" = "Copier dans le presse-papiers"; + +"item_detail.add_creator" = "Ajouter un créateur"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Ajouter une note"; +"item_detail.tags" = "Marqueurs"; +"item_detail.add_tag" = "Ajouter un marqueur"; +"item_detail.attachments" = "Pièces jointes"; +"item_detail.add_attachment" = "Ajouter une pièces jointe"; +"item_detail.split_name" = "Scinder l'intitulé"; +"item_detail.merge_name" = "Fusionner l'intitulé"; +"item_detail.untitled" = "Titre"; +"item_detail.show_more" = "Afficher plus"; +"item_detail.show_less" = "Afficher moins"; +"item_detail.view_pdf" = "Afficher le PDF"; +"item_detail.data_reloaded" = "Ce document a été modifié à distance. Il va maintenant se recharger."; +"item_detail.delete_attachment_file" = "Supprimer le téléchargement"; +"item_detail.deleted_title" = "Supprimé"; +"item_detail.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; +"item_detail.move_to_standalone_attachment" = "Convertir en pièce jointe indépendante"; + +"tag_picker.title" = "%d sélectionné"; +"tag_picker.placeholder" = "Intitulé de marqueur"; +"tag_picker.create_tag" = "Créer le marqueur “%@”"; +"tag_picker.confirm_deletion_question" = "Supprimer les marqueurs ajoutés automatiquement"; +"tag_picker.search_placeholder" = "Rechercher dans les marqueurs"; +"tag_picker.deselect_all" = "Tout désélectionner"; +"tag_picker.show_auto" = "Afficher les marqueurs ajoutés automatiquement"; +"tag_picker.show_all" = "Afficher tous les marqueurs de cette bibliothèque"; +"tag_picker.delete_automatic" = "Supprimer les marqueurs ajoutés automatiquement de cette bibliothèque"; + +"creator_editor.creator" = "Type de créateur"; +"creator_editor.first_name" = "Prénom"; +"creator_editor.last_name" = "Nom"; +"creator_editor.switch_to_single" = " Afficher un champ unique"; +"creator_editor.switch_to_dual" = "Afficher deux champs"; +"creator_editor.delete_confirmation" = "Voulez-vous vraiment supprimer ce créateur ?"; + +"pdf.annotations_sidebar.search_title" = "Rechercher"; +"pdf.annotations_sidebar.add_comment" = "Ajouter un commentaire"; +"pdf.annotations_sidebar.add_tags" = "Ajouter des marqueurs"; +"pdf.annotations_sidebar.merge" = "Fusionner"; +"pdf.annotations_sidebar.filter.title" = "Filtrer les annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Sélectionner les marqueurs..."; +"pdf.search.title" = "Rechercher dans le document"; +"pdf.search.failed" = "La recherche n'a pas abouti"; +"pdf.search.dismiss" = "Ignorer la recherche"; +"pdf.annotation_popover.title" = "Modifier l'annotation"; +"pdf.annotation_popover.delete" = "Supprimer l'annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Mettre à jour les pages suivantes"; +"pdf.annotation_popover.page_label_title" = "Modifier le numéro de page"; +"pdf.annotation_popover.no_comment" = "Aucun commentaire"; +"pdf.annotation_popover.line_width" = "Largeur"; +"pdf.annotation_popover.size" = "Taille"; +"pdf.deleted_title" = "Supprimé"; +"pdf.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Surligner"; +"pdf.underline" = "Souligner"; +"pdf.annotation_share.image.share" = "Partager l'image"; +"pdf.annotation_share.image.medium" = "Média"; +"pdf.annotation_share.image.large" = "Grandes dimensions"; +"pdf.annotation_toolbar.eraser" = "Gomme"; +"pdf.annotation_toolbar.highlight" = "Surligner"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Manuscrite"; +"pdf.annotation_toolbar.underline" = "Souligner"; +"pdf.annotation_toolbar.text" = "Texte"; +"pdf.locked.locked" = "Verrouillé"; +"pdf.locked.enter_password" = "Veuillez saisir le mot de passe pour ouvrir ce fichier PDF."; +"pdf.locked.failed" = "Mot de passe incorrect. Veuillez essayer à nouveau."; +"pdf.settings.scroll_direction.title" = "Direction de défilement"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Transition de page"; +"pdf.settings.page_transition.jump" = "Aller"; +"pdf.settings.page_transition.continuous" = "Continu"; +"pdf.settings.appearance.title" = "Apparence"; +"pdf.settings.appearance.auto" = "Automatique"; +"pdf.settings.appearance.light_mode" = "Lumineux"; +"pdf.settings.appearance.dark_mode" = "Sombre"; +"pdf.settings.appearance.sepia_mode" = " Sépia"; +"pdf.settings.page_mode.title" = "Mode de page"; +"pdf.settings.page_mode.single" = "Simple"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatique"; +"pdf.settings.page_fitting.title" = "Ajustement de la page"; +"pdf.settings.page_fitting.fit" = "Ajuster"; +"pdf.settings.page_fitting.fill" = "Remplir"; +"pdf.settings.page_spreads.title" = "Doubles pages"; +"pdf.settings.page_spreads.odd" = "Pair"; +"pdf.settings.page_spreads.even" = "Impair"; +"pdf.settings.page_fitting.automatic" = "Automatique"; +"pdf.export.export" = "Exporter le fichier PDF"; +"pdf.export.export_annotated" = "Exporter le fichier PDF annoté"; +"pdf.sidebar.no_annotations" = "Pas d'annotations"; +"pdf.sidebar.no_outline" = "Pas de table des matières"; +"pdf.delete_annotation" = "Voulez-vous vraiment supprimer cette annotation ?"; +"pdf.previous_page" = "Page précédente"; +"pdf.next_page" = "Page suivante"; +"pdf.previous_viewport" = "Viewport précédent"; +"pdf.next_viewport" = "Viewport suivant"; + +"settings.title" = "Paramètres"; +"settings.logout" = "Se déconnecter"; +"settings.logout_warning" = "Toutes les données locales qui n'ont pas été synchronisées seront supprimées. Voulez-vous vraiment vous déconnecter ?"; +"settings.general.title" = "Général"; +"settings.general.show_subcollections_title" = "Afficher les documents des sous-collections"; +"settings.general.show_collection_item_counts" = "Afficher la taille des collections"; +"settings.general.open_links_in_external_browser" = "Ouvrir les liens dans un navigateur externe"; +"settings.general.autoempty_title" = "Supprimer les documents de la corbeille"; +"settings.general.never" = "Jamais"; +"settings.item_count" = "Nombre de documents"; +"settings.item_count_subtitle" = "Afficher le nombre de documents pour toutes les collections"; +"settings.sync.title" = "Compte"; +"settings.sync.data_syncing" = "Synchronisation des données"; +"settings.sync.file_syncing" = "Synchronisation des fichiers"; +"settings.sync.file_syncing_type_message" = "Synchroniser les fichiers joints de Ma bibliothèque en utilisant"; +"settings.sync.account" = "Compte"; +"settings.sync.manage_account" = "Gérer le compte"; +"settings.sync.delete_account" = "Supprimer le compte"; +"settings.sync.username" = "Nom d'utilisateur"; +"settings.sync.password" = "Mot de passe"; +"settings.sync.verify" = "Vérifier le serveur"; +"settings.sync.directory_not_found.title" = "Répertoire non trouvé"; +"settings.sync.directory_not_found.message" = "%@ n'existe pas.Voulez-vous le créer maintenant ?"; +"settings.sync.verified" = "Vérifié"; +"settings.permission" = "Autorisation de l'utilisateur"; +"settings.permission_subtitle" = "Demander l'autorisation de l'utilisateur pour chaque action d'écriture"; +"settings.translators" = "Convertisseurs"; +"settings.translators_update" = "Mettre à jour les convertisseurs"; +"settings.translators_updating" = "Mise à jour..."; +"settings.reset_to_bundled" = "Réinitialiser à la configuration initiale"; +"settings.debug" = " Journal de débogage"; +"settings.logging_title" = "Enregistrement"; +"settings.start_logging" = "Débuter l'enregistrement"; +"settings.start_logging_on_launch" = "Commencer l'enregistrement lors du prochain lancement de l'application"; +"settings.cancel_logging" = "Annuler l'enregistrement"; +"settings.stop_logging" = "Arrêter l'enregistrement"; +"settings.view_output" = " Voir le journal"; +"settings.clear_output" = "Effacer le journal"; +"settings.logging_desc1" = "Pour résoudre un problème au démarrage, forcez la fermeture de l'application et redémarrez-la."; +"settings.logging_desc2" = "Pour résoudre un problème lié à une extension de partage, ouvrez l'extension de partage."; +"settings.send_manually" = "Envoyer manuellement"; +"settings.log_alert.progress_title" = "Envoi des journaux"; +"settings.log_alert.title" = "Journaux envoyés"; +"settings.log_alert.message" = "Votre Debug ID est %@"; +"settings.crash_alert.title" = "Journal des plantages envoyé"; +"settings.crash_alert.message" = "Votre Report ID est %@. Veuillez poster un message sur les Forums Zotero (forums.zotero.org) avec ce Report ID et toutes les étapes nécessaires pour reproduire le plantage."; +"settings.crash_alert.message_with_db" = "Votre Report ID est %@.Veuillez publier un message sur les forums Zotero (forums.zotero.org) en indiquant ce Report ID et toutes les étapes nécessaires pour reproduire le plantage.Si Zotero plante de manière répétée, veuillez appuyer sur « Exporter la base de données » et envoyer les fichiers exportés à support@zotero.org."; +"settings.crash_alert.submit_forum" = "Envoyer sur les forums Zotero"; +"settings.crash_alert.export_db" = "Copier et exporter la base de données"; +"settings.crash_alert.copy" = "Copier dans le presse-papiers"; +"settings.websocket_title" = "Connexion au serveur"; +"settings.websocket_connected" = "Connecté"; +"settings.websocket_connecting" = "Connexion en cours"; +"settings.websocket_disconnected" = "Déconnecté"; +"settings.websocket_disconnect" = "Déconnecté du serveur"; +"settings.websocket_connect" = "Connecter au serveur"; +"settings.storage" = "Stockage local"; +"settings.storage.delete_all" = "Supprimer tous les fichiers joints locaux"; +"settings.storage.delete_all_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints ?"; +"settings.storage.delete_library_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints ?Les autres appareils synchronisés ne seront pas affectés."; +"settings.saving.title" = "Enregistrement en cours"; +"settings.saving.files_title" = "Enregistrer les fichiers"; +"settings.saving.files_message" = "Joindre automatiquement les fichiers PDF et les autres fichiers associés lors de l'enregistrement des documents"; +"settings.saving.tags_title" = "Enregistrer les marqueurs ajoutés automatiquement"; +"settings.saving.tags_message" = "Ajouter automatiquement aux documents des marqueurs à partir des mots-clés fournis"; +"settings.cite.title" = "Citer"; +"settings.cite.styles_title" = "Styles de citation"; +"settings.cite.get_more_styles" = "Obtenir d'autres styles…"; +"settings.cite_search.search_title" = "Rechercher des styles"; +"settings.export.title" = "Copie rapide"; +"settings.export.default_format" = "Format par défaut"; +"settings.export.language" = "Langue"; +"settings.export.copy_as_html" = "Copier en HTML"; +"settings.versionAndBuild" = "Version %@ build %@"; +"settings.export_db" = "Exporter le fichier de base de données"; +"settings.full_sync_debug" = "Avancé"; +"settings.full_sync.start" = "Lancer le débogage de la synchronisation complète"; +"settings.full_sync.other_in_progress" = "Une opération de synchronisation est déjà en cours. Veuillez attendre qu'elle se termine."; +"settings.full_sync.in_progress" = "Une opération de synchronisation complète est déjà en cours. Veuillez attendre qu'elle se termine et publier le Debug ID sur les forums Zotero."; +"settings.annotation_tools" = "Outils d'annotation"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Réinitialiser"; + +"shareext.save" = "Enregistrer dans Zotero"; +"shareext.decoding_attachment" = "Recherche de documents"; +"shareext.translation.item_selection" = "Choisir un document"; +"shareext.translation.translating_with" = "Enregistrement avec %@"; +"shareext.loading_collections" = "Chargement des collections"; +"shareext.sync_error" = "Impossible de synchroniser les collections"; +"shareext.collection_other" = "Plus"; +"shareext.item_title" = "Document"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Marqueurs"; + +"searchbar.placeholder" = "Rechercher"; +"searchbar.accessibility_cancel" = "Annuler la recherche"; +"searchbar.accessibility_clear" = "Effacer la recherche"; + +"errors.schema" = "Certaines données de Ma bibliothèque n'ont pas pu être téléchargées. Elles ont peut-être été enregistrées avec une version plus récente de Zotero. Les autres données continueront à se synchroniser."; +"errors.parsing" = "Impossible d'interpréter certaines données. La synchronisation des autres données va continuer."; +"errors.api" = "Échec de la réponse API : %@"; +"errors.db" = "Impossible de se connecter à la base de données. Le stockage de l'appareil est peut-être plein."; +"errors.versionMismatch" = "Une modification à distance a été effectuée pendant la synchronisation."; +"errors.unknown" = "Erreur inconnue"; +"errors.attachments.cant_unzip_snapshot" = "Impossible de décompresser la capture"; +"errors.attachments.incompatible_attachment" = "Les fichiers liés ne sont pas pris en charge sur les appareils mobiles. Vous pouvez les ouvrir à l'aide de l'application de bureau Zotero."; +"errors.attachments.cant_open_attachment" = "Impossible de trouver le fichier joint."; +"errors.attachments.missing_zotero" = "Le fichier joint n'est pas disponible dans la bibliothèque en ligne."; +"errors.attachments.missing_webdav" = "Le fichier joint n'est pas disponible sur le serveur WebDAV."; +"errors.attachments.missing_additional" = "Veuillez vérifier que le fichier a bien été synchronisé sur l'appareil où il a été ajouté."; +"errors.attachments.unauthorized_webdav" = "Le serveur WebDAV n'a pas accepté le nom d'utilisateur et le mot de passe que vous avez enregistrés dans les paramètres."; +"errors.attachments.too_many_requests_webdav" = "Le serveur WebDAV limite vos requêtes. Essayez à nouveau dans quelques minutes ou vérifiez vos identifiants de connexion."; +"errors.attachments.too_many_requests" = "Trop de requêtes. Veuillez essayer à nouveau dans quelques minutes."; +"errors.attachments.forbidden_webdav" = "Vous n'avez pas le droit d'accéder à %@ sur le serveur WebDAV."; +"errors.attachments.generic_filename" = "le fichier"; +"errors.login.invalid_password" = "Mot de passe non valide"; +"errors.login.invalid_username" = "Nom d'utilisateur non valide"; +"errors.login.invalid_credentials" = "Utilisateur ou mot de passe invalide"; +"errors.libraries.cantLoad" = "Impossible de charger les bibliothèques"; +"errors.collections.empty_name" = "Veuillez saisir un nom de collection"; +"errors.collections.save_failed" = "Impossible d'enregistrer la collection"; +"errors.collections.bibliography_failed" = "Impossible de charger les documents pour la bibliographie"; +"errors.sync.group_removed" = "Le groupe “%@” n'est plus accessible. Que voulez-vous faire ?"; +"errors.sync.metadata_write_denied" = "Vous n'avez plus les droits d'écriture pour le groupe “%@”. Que voulez-vous faire ?"; +"errors.sync.revert_to_original" = "Revenir à l'original"; +"errors.sync.file_write_denied" = "Vous n'avez plus d'accès en écriture au groupe “%@”, et les fichiers que vous avez modifiés localement ne peuvent pas être mis en ligne. Si vous continuez, l'état de tous les fichiers du groupe sera réinitialisé à celui sur %@. Si vous souhaitez avoir une chance de copier vos modifications ailleurs ou de demander le droit d'accès en écriture à un administrateur du groupe, vous pouvez passer la synchronisation du groupe maintenant.."; +"errors.sync.reset_group_files" = "Réinitialiser les fichier des groupes et synchroniser"; +"errors.sync.skip_group" = "Passer le groupe"; +"errors.sync_toolbar.finished_with_errors" = "Synchronisation terminée (%@)"; +"errors.sync_toolbar.attachment_missing" = "Impossible de télécharger la pièce jointe : %@. Veuillez essayer de supprimer et d'ajouter à nouveau la pièce jointe."; +"errors.sync_toolbar.libraries_missing" = "Aucune bibliothèque trouvée. Veuillez vous déconnecter puis vous reconnecter."; +"errors.sync_toolbar.groups_failed" = "Impossible de synchroniser les groupes. Veuillez essayer à nouveau."; +"errors.sync_toolbar.conflict_retry_limit" = "Synchronisation à distance en cours. Veuillez essayer à nouveau dans quelques minutes."; +"errors.sync_toolbar.group_permissions" = "Vous n'avez pas l'autorisation de modifier les groupes."; +"errors.sync_toolbar.internet_connection" = "Impossible de se connecter au réseau. Veuillez essayer à nouveau."; +"errors.sync_toolbar.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.Consultez les paramètres de votre compte zotero.org pour connaître les options de stockage supplémentaire."; +"errors.sync_toolbar.group_quota_reached" = "Le groupe \"%@\" a atteint son quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.Le propriétaire du groupe peut augmenter la capacité de stockage du groupe à partir des ses paramètres de stockage sur zotero.org."; +"errors.sync_toolbar.insufficient_space" = "Vous ne disposez pas de suffisamment d'espace sur votre serveur WebDAV. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à se synchroniser."; +"errors.sync_toolbar.quota_reached_short" = "Quota atteint."; +"errors.sync_toolbar.unavailable" = "Les services Zotero sont momentanément indisponibles. Veuillez réessayer dans quelques minutes."; +"errors.sync_toolbar.webdav_error" = "Impossible de supprimer les fichiers de votre serveur WebDAV : \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Fichier prop invalide : %@"; +"errors.sync_toolbar.show_item" = "Afficher le document"; +"errors.sync_toolbar.show_items" = "Afficher les documents"; +"errors.sync_toolbar.forbidden" = "Utilisateur ou mot de passe invalide"; +"errors.sync_toolbar.forbidden_message" = "Le serveur de synchronisation Zotero n'a pas accepté votre nom d'utilisateur et votre mot de passe.Veuillez vous déconnecter et vous connecter avec des identifiants corrects."; +"errors.sync_toolbar.webdav_request_failed" = "Votre serveur WebDAV a renvoyé une erreur HTTP %d pour une requête %@."; +"errors.items.loading" = "Impossible de charger les documents"; +"errors.items.deletion" = "Impossible de supprimer le document"; +"errors.items.deletion_from_collection" = "Impossible de retirer le document de la collection"; +"errors.items.add_to_collection" = "Impossible d'ajouter le document à la collection"; +"errors.items.move_item" = "Impossible de déplacer le document"; +"errors.items.save_note" = "Impossible d'enregistrer la note"; +"errors.items.add_attachment" = "Impossible d'ajouter la pièce jointe"; +"errors.items.add_some_attachments" = "Certaines pièces jointes n'ont pas été ajoutées : %@"; +"errors.items.load_duplication" = "Impossible de charger le document à dupliquer"; +"errors.items.generating_bib" = "Impossible de générer la bibliographie"; +"errors.citation_preview" = "Impossible de générer l'aperçu de la citation"; +"errors.item_detail.dropped_fields_title" = "Changer le type de document"; +"errors.item_detail.dropped_fields_message" = "Êtes-vous sûr de vouloir modifier le type du document?Les champs suivants seront perdus :%@"; +"errors.item_detail.cant_load_data" = "Impossible de charger les données. Veuillez essayer à nouveau."; +"errors.item_detail.cant_create_attachments_with_names" = "Impossible de créer les pièces jointes : %@"; +"errors.item_detail.cant_create_attachments" = "Impossible de créer les pièces jointes"; +"errors.item_detail.cant_save_note" = "Impossible d'enregistrer la note"; +"errors.item_detail.cant_save_changes" = "Impossible d'enregistrer les modifications"; +"errors.item_detail.cant_trash_item" = "Impossible de mettre le document à la corbeille"; +"errors.item_detail.cant_save_tags" = "Impossible d'enregistrer les marqeurs"; +"errors.item_detail.unsupported_type" = "Type \"%@\" non pris en charge"; +"errors.settings.storage" = "Impossible de collecter les données de stockage"; +"errors.settings.webdav.file_missing_after_upload" = "Un problème potentiel a été détecté avec votre serveur WebDAV.Un fichier en ligne n'était pas immédiatement disponible au téléchargement. Il peut y avoir un léger délai entre le moment où vous mettez en ligne des fichiers et celui où ils deviennent disponibles, en particulier si vous utilisez un service de stockage en nuage.Si la synchronisation des fichiers Zotero semble fonctionner normalement, vous pouvez ignorer ce message. Si vous rencontrez des difficultés, veuillez publier un message sur les forums Zotero."; +"errors.settings.webdav.invalid_url" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.no_password" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.no_url" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.no_username" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.non_existent_file_not_missing" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.not_dav" = "Pas une URL WebDAV valide"; +"errors.settings.webdav.parent_dir_not_found" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.zotero_dir_not_found" = "Erreur de vérification WebDAV"; +"errors.settings.webdav.unauthorized" = "Le serveur WebDAV n'a pas accepté le nom d'utilisateur et le mot de passe que vous avez saisis."; +"errors.settings.webdav.forbidden" = "Vous n'avez pas le droit d'accéder au dossier spécifié sur le serveur WebDAV."; +"errors.settings.webdav.internet_connection" = "Impossible de se connecter au réseau. Veuillez essayer à nouveau."; +"errors.settings.webdav.host_not_found" = "Impossible de se connecter au serveur WebDAV"; +"errors.settings.webdav.ats" = "En raison des restrictions iOS, vous devez utiliser HTTPS pour vous connecter à un serveur WebDAV non local."; +"errors.shareext.logged_out" = "Veuillez vous connecter à l'application avant d'utiliser cette extension."; +"errors.shareext.cant_load_data" = "Impossible de charger les données. Veuillez essayer à nouveau."; +"errors.shareext.unknown" = "Une erreur indéterminée est survenue."; +"errors.shareext.cant_load_schema" = "Une erreur s'est produite. Veuillez ouvrir l'application Zotero, synchroniser, et réessayer."; +"errors.shareext.download_failed" = "Impossible de télécharger le fichier"; +"errors.shareext.items_not_found" = "Aucun document trouvé sur la page"; +"errors.shareext.schema_error" = "Certaines données n'ont pas pu être téléchargées. Elles ont peut-être été enregistrées avec une version plus récente de Zotero."; +"errors.shareext.translation_failed" = "L'enregistrement a échoué"; +"errors.shareext.response_missing_data" = "Une erreur est survenue. Veuillez essayer à nouveau."; +"errors.shareext.failed_additional" = "Vous pouvez toujours enregistrer cette page en tant que document de type \"Page web\"."; +"errors.shareext.file_not_pdf" = "Impossible d'enregistrer le fichier PDF"; +"errors.shareext.api_error" = "Erreur de mise en ligne du document. Le document a été enregisté dans votre bibliothèque locale."; +"errors.shareext.webdav_error" = "Erreur lors du téléchargement de la pièce jointe vers le serveur WebDAV"; +"errors.shareext.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Consultez les paramètres de votre compte pour connaître les options de stockage supplémentaire. Le fichier a été enregistré dans votre bibliothèque locale."; +"errors.shareext.group_quota_reached" = "Le groupe “%@” a atteint son quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Le propriétaire du groupe peut trouver des options de stockage supplémentaires dans les paramètres de son compte.Le fichier a été enregistré dans la bibliothèque locale."; +"errors.shareext.forbidden" = "Vous n'avez pas les droits nécessaires pour ajouter ce document à %@."; +"errors.shareext.webdav_not_verified" = "Erreur de vérification WebDAV"; +"errors.shareext.requires_browser" = "Ce contenu doit être chargé dans un navigateur pour être partagé avec Zotero. Ouvrez-le dams votre navigateur et utilisez le bouton Partager du navigateur."; +"errors.db_failure" = "Erreur de création de la base de données. Essayez de vous connecter à nouveau."; +"errors.logging.title" = "Erreur de débogage"; +"errors.logging.start" = "Impossible de démarrer le journal de débogage"; +"errors.logging.no_logs_recorded" = "Il n'y a eu aucune sortie de débogage pendant l'enregistrement"; +"errors.logging.upload" = "Impossible de mettre en ligne les enregistrements. Veuillez réessayer."; +"errors.logging.response_parsing" = "Réponse inattendue du serveur"; +"errors.translators.bundle_loading" = "Impossible de mettre à jour les convertisseurs. Essayer à nouveau ?"; +"errors.styles.addition" = "Impossible d'ajouter le style “%@”"; +"errors.styles.deletion" = "Impossible de supprimer le style “%@”"; +"errors.styles.loading" = "Impossible de charger les styles"; +"errors.styles_search.loading" = "Impossible de charger les styles. Essayer à nouveau ?"; +"errors.citation.generate_citation" = "Impossible de générer la citation"; +"errors.citation.generate_bibliography" = "Impossible de générer la bibliographie"; +"errors.citation.invalid_types" = "Types de documents invalides sélectionnés"; +"errors.citation.missing_style" = "Aucun style de citation sélectionné. Allez dans Paramètres → Copie rapide et sélectionnez un nouveau style."; +"errors.citation.open_settings" = "Ouvrir les paramètres"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero n'a trouvé aucun identifiant dans votre saisie. Veuillez vérifier votre saisie et essayer à nouveau."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero n'a trouvé aucun identifiant dans votre saisie, ou ces identifiants ont déjà été ajoutés. Veuillez vérifier votre saisie et essayer à nouveau."; +"errors.pdf.merge_too_big_title" = "Impossible de fusionner les annotations"; +"errors.pdf.merge_too_big" = "L'annotation combinée serait trop longue."; +"errors.pdf.cant_update_annotation" = "Impossible de mettre à jour l'annotation"; +"errors.pdf.cant_add_annotations" = "Impossible d'ajouter les annotations"; +"errors.pdf.cant_delete_annotations" = "Impossible de supprimer les annotations"; +"errors.pdf.incompatible_document" = "Ce document n'est pas pris en charge."; +"errors.pdf.empty_document" = "Ce document est vide."; +"errors.pdf.page_index_not_int" = "Format de page incorrect enregistré pour ce document"; +"errors.pdf.document_changed" = "Ce document a été modifié sur un autre appareil. Veuillez le rouvrir pour continuer à le modifier."; + +"accessibility.untitled" = "Titre"; +"accessibility.locked" = "Verrouillé"; +"accessibility.archived" = "Archivé"; +"accessibility.collections.items" = "documents"; +"accessibility.collections.expand" = "Développer"; +"accessibility.collections.collapse" = "Réduire"; +"accessibility.collections.create_collection" = "Créer une collection"; +"accessibility.collections.search_collections" = "Rechercher dans les collections"; +"accessibility.collections.expand_all_collections" = "Développer toutes les collections"; +"accessibility.items.open_item" = "Ouvrir l'info du document"; +"accessibility.items.select_items" = "Sélectionner les documents"; +"accessibility.items.select_all_items" = "Sélectionner tous les documents"; +"accessibility.items.deselect_all_items" = "Désélectionner tous les documents"; +"accessibility.items.filter_items" = "Filtrer les documents"; +"accessibility.items.sort_items" = "Trier les documents"; +"accessibility.items.add_to_collection" = "Ajouter à la collection les documents sélectionnés"; +"accessibility.items.remove_from_collection" = "Retirer de la collection les documents sélectionnés"; +"accessibility.items.trash" = "Mettre les documents sélectionnés à la corbeille"; +"accessibility.items.delete" = "Supprimer les documents sélectionnés"; +"accessibility.items.restore" = "Restaurer les documents sélectionnés"; +"accessibility.items.duplicate" = "Dupliquer le document sélectionné"; +"accessibility.items.share" = "Partager les documents sélectionnés"; +"accessibility.items.download_attachments" = "Télécharger les pièces jointes pour les documents sélectionnés"; +"accessibility.items.remove_downloads" = "Supprimer les téléchargements pour les documents sélectionnés"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Appuyer deux fois pour télécharger et ouvrir"; +"accessibility.item_detail.open" = "Appuyer deux fois pour ouvrir"; +"accessibility.pdf.sidebar_open" = "Ouvrir la barre latérale"; +"accessibility.pdf.sidebar_close" = "Fermer la barre latérale"; +"accessibility.pdf.share" = "Partager le fichier PDF"; +"accessibility.pdf.export" = "Exporter le fichier PDF"; +"accessibility.pdf.export_annotated" = "Exporter le fichier PDF annoté"; +"accessibility.pdf.settings" = "Paramètres"; +"accessibility.pdf.color_picker" = "Sélecteur de couleurs"; +"accessibility.pdf.highlight_annotation_tool" = "Créer une annotation de type surlignement"; +"accessibility.pdf.note_annotation_tool" = "Créer une annotation de type note"; +"accessibility.pdf.image_annotation_tool" = "Créer une annotation de type image"; +"accessibility.pdf.ink_annotation_tool" = "Créer une annotation manuscrite"; +"accessibility.pdf.underline_annotation_tool" = "Créer une annotation de type soulignement"; +"accessibility.pdf.text_annotation_tool" = "Créer une annotation de type texte"; +"accessibility.pdf.eraser_annotation_tool" = "Gomme"; +"accessibility.pdf.highlight_annotation" = "Annotation de type surlignement"; +"accessibility.pdf.note_annotation" = "Annotation de type note"; +"accessibility.pdf.image_annotation" = "Annotation de type image"; +"accessibility.pdf.ink_annotation" = "Annotation manuscrite"; +"accessibility.pdf.underline_annotation" = "Annotation de type soulignement"; +"accessibility.pdf.text_annotation" = "Annotation de type texte"; +"accessibility.pdf.edit_annotation" = "Modifier l'annotation"; +"accessibility.pdf.share_annotation" = "Partager l'annotation"; +"accessibility.pdf.share_annotation_image" = "Partager l'annotation de type image"; +"accessibility.pdf.eraser_annotation" = "Gomme"; +"accessibility.pdf.highlighted_text" = "Texte surligné"; +"accessibility.pdf.underlined_text" = "Texte souligné"; +"accessibility.pdf.author" = "Auteur"; +"accessibility.pdf.comment" = "Commentaire"; +"accessibility.pdf.tags" = "Marqueurs"; +"accessibility.pdf.annotation_hint" = "Appuyer deux fois pour sélectionner et modifier"; +"accessibility.pdf.tags_hint" = "Appuyer deux fois pour modifier les marqueurs"; +"accessibility.pdf.selected" = "Sélectionné"; +"accessibility.pdf.search_pdf" = "Rechercher dans les fichiers PDF"; +"accessibility.pdf.redo" = "Rétablir"; +"accessibility.pdf.undo" = "Annuler"; +"accessibility.pdf.toggle_annotation_toolbar" = "Masquer/afficher la barre d'outils d'annotation"; +"accessibility.pdf.show_more_tools" = "Afficher plus"; +"accessibility.htmlepub.search_html" = "Rechercher sur le site web"; +"accessibility.htmlepub.search_epub" = "Rechercher dans les fichiers EPUB"; +"accessibility.speech.play" = "Début de la conversation"; +"accessibility.speech.pause" = "Pause dans la conversation"; +"accessibility.speech.forward" = "Aller en avant"; +"accessibility.speech.backward" = "Revenir en arrière"; +"accessibility.speech.title" = "Lire à haute voix"; +"accessibility.show_reader" = "Mode de lecture"; +"accessibility.show_reader_accessibility_label" = "Passer au mode de lecture"; +"accessibility.show_speech" = "Lire à haute voix"; +"accessibility.show_speech_accessibility_label" = "Commencer à lire à haute voix"; +"accessibility.open_document_accessibility" = "Ouvrir les options d'accessibilité"; diff --git a/Zotero/Assets/fr.lproj/Localizable.stringsdict b/Zotero/Assets/fr.lproj/Localizable.stringsdict new file mode 100644 index 000000000..4b0491230 --- /dev/null +++ b/Zotero/Assets/fr.lproj/Localizable.stringsdict @@ -0,0 +1,239 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 collection sélectionnée + many + %d collections sélectionnées + other + %d collections sélectionnées + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Voulez-vous vraiment supprimer le document sélectionné ? + many + Voulez-vous vraiment supprimer les documents sélectionnés ? + other + Voulez-vous vraiment supprimer les documents sélectionnés ? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Voulez-vous vraiment retirer de cette collection le document sélectionné ? + many + Voulez-vous vraiment retirer de cette collection les documents sélectionnés ? + other + Voulez-vous vraiment retirer de cette collection les documents sélectionnés ? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filtrer: 1 document + many + Filtrer: %d documents + other + Filtrer: %d documents + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 correspondance trouvée + many + %d correspondances trouvées + other + %d correspondances trouvées + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 fichier (%.2f %@) + many + %d fichiers (%.2f %@) + other + %d fichiers (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 problème + many + %d problèmes + other + %d problèmes + + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 marqueur sélectionné + many + %d marqueurs sélectionnés + other + %d marqueurs sélectionnés + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Voulez-vous vraiment supprimer de cette bibliothèque 1 marqueur ajouté automatiquement ? Cette action ne peut pas être annulée. + many + Voulez-vous vraiment supprimer de cette bibliothèque %d marqueurs ajoutés automatiquement ? Cette action ne peut pas être annulée. + other + Voulez-vous vraiment supprimer de cette bibliothèque %d marqueurs ajoutés automatiquement ? Cette action ne peut pas être annulée. + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 ligne enregistrée + many + %d lignes enregistrées + other + %d lignes enregistrées + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 ligne + many + %d lignes + other + %d lignes + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Impossible de supprimer 1 fichier de votre serveur WebDAV. + many + Impossible de supprimer %d fichiers de votre serveur WebDAV. + other + Impossible de supprimer %d fichiers de votre serveur WebDAV. + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Après 1 jour + many + Après %d jours + other + Après %d jours + + + + diff --git a/Zotero/Assets/gl.lproj/InfoPList.strings b/Zotero/Assets/gl.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/gl.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/gl.lproj/Localizable.strings b/Zotero/Assets/gl.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/gl.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/gl.lproj/Localizable.stringsdict b/Zotero/Assets/gl.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/gl.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/he.lproj/InfoPList.strings b/Zotero/Assets/he.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/he.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/he.lproj/Localizable.strings b/Zotero/Assets/he.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/he.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/he.lproj/Localizable.stringsdict b/Zotero/Assets/he.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/he.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/hr.lproj/InfoPList.strings b/Zotero/Assets/hr.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/hr.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/hr.lproj/Localizable.strings b/Zotero/Assets/hr.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/hr.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/hr.lproj/Localizable.stringsdict b/Zotero/Assets/hr.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/hr.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/hu.lproj/InfoPList.strings b/Zotero/Assets/hu.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/hu.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/hu.lproj/Localizable.strings b/Zotero/Assets/hu.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/hu.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/hu.lproj/Localizable.stringsdict b/Zotero/Assets/hu.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/hu.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/hy.lproj/InfoPList.strings b/Zotero/Assets/hy.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/hy.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/hy.lproj/Localizable.strings b/Zotero/Assets/hy.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/hy.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/hy.lproj/Localizable.stringsdict b/Zotero/Assets/hy.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/hy.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/id.lproj/InfoPList.strings b/Zotero/Assets/id.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/id.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/id.lproj/Localizable.strings b/Zotero/Assets/id.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/id.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/id.lproj/Localizable.stringsdict b/Zotero/Assets/id.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/id.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ig.lproj/InfoPList.strings b/Zotero/Assets/ig.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ig.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ig.lproj/Localizable.strings b/Zotero/Assets/ig.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ig.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ig.lproj/Localizable.stringsdict b/Zotero/Assets/ig.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ig.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/is.lproj/InfoPList.strings b/Zotero/Assets/is.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/is.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/is.lproj/Localizable.strings b/Zotero/Assets/is.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/is.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/is.lproj/Localizable.stringsdict b/Zotero/Assets/is.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/is.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/it.lproj/InfoPList.strings b/Zotero/Assets/it.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/it.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/it.lproj/Localizable.strings b/Zotero/Assets/it.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/it.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/it.lproj/Localizable.stringsdict b/Zotero/Assets/it.lproj/Localizable.stringsdict new file mode 100644 index 000000000..26bd0188e --- /dev/null +++ b/Zotero/Assets/it.lproj/Localizable.stringsdict @@ -0,0 +1,239 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 collezione selezionata + many + %d collezioni selezionate + other + %d collezioni selezionate + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Vuoi eliminare l'elemento selezionato? + many + Vuoi eliminare gli elementi selezionati? + other + Vuoi eliminare gli elementi selezionati? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Vuoi rimuovere l'elemento selezionato da questa collezione? + many + Vuoi rimuovere gli elementi selezionati da questa collezione? + other + Vuoi rimuovere gli elementi selezionati da questa collezione? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filtro: 1 elemento + many + Filtro: %d elementi + other + Filtro: %d elementi + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Trovata 1 corrispondenza + many + Trovate %d corrispondenze + other + Trovate %d corrispondenze + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + many + %d file (%.2f %@) + other + %d file (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 problema + many + %d problemi + other + %d problemi + + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selezionato + many + %d tag selezionati + other + %d tag selezionati + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Vuoi eliminare 1 tag automatico in questa biblioteca?\n\nQuesta operazione non può essere annullata. + many + Vuoi eliminare %d tag automatici in questa biblioteca?\n\nQuesta operazione non può essere annullata. + other + Vuoi eliminare %d tag automatici in questa biblioteca?\n\nQuesta operazione non può essere annullata. + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 linea registrata + many + %d linee registrate + other + %d linee registrate + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 linea + many + %d linee + other + %d linee + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Impossibile eliminare 1 file dal tuo server WebDAV + many + Impossibile eliminare %d file dal tuo server WebDAV + other + Impossibile eliminare %d file dal tuo server WebDAV + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Dopo 1 giorno + many + Dopo %d giorni + other + Dopo %d giorni + + + + diff --git a/Zotero/Assets/ja.lproj/InfoPList.strings b/Zotero/Assets/ja.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ja.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ja.lproj/Localizable.strings b/Zotero/Assets/ja.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ja.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ja.lproj/Localizable.stringsdict b/Zotero/Assets/ja.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ja.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/jv.lproj/InfoPList.strings b/Zotero/Assets/jv.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/jv.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/jv.lproj/Localizable.strings b/Zotero/Assets/jv.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/jv.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/jv.lproj/Localizable.stringsdict b/Zotero/Assets/jv.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/jv.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ka.lproj/InfoPList.strings b/Zotero/Assets/ka.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ka.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ka.lproj/Localizable.strings b/Zotero/Assets/ka.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ka.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ka.lproj/Localizable.stringsdict b/Zotero/Assets/ka.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ka.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/kk.lproj/InfoPList.strings b/Zotero/Assets/kk.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/kk.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/kk.lproj/Localizable.strings b/Zotero/Assets/kk.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/kk.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/kk.lproj/Localizable.stringsdict b/Zotero/Assets/kk.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/kk.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/km.lproj/InfoPList.strings b/Zotero/Assets/km.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/km.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/km.lproj/Localizable.strings b/Zotero/Assets/km.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/km.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/km.lproj/Localizable.stringsdict b/Zotero/Assets/km.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/km.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/kn.lproj/InfoPList.strings b/Zotero/Assets/kn.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/kn.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/kn.lproj/Localizable.strings b/Zotero/Assets/kn.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/kn.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/kn.lproj/Localizable.stringsdict b/Zotero/Assets/kn.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/kn.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ko.lproj/InfoPList.strings b/Zotero/Assets/ko.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ko.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ko.lproj/Localizable.strings b/Zotero/Assets/ko.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ko.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ko.lproj/Localizable.stringsdict b/Zotero/Assets/ko.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ko.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/lt.lproj/InfoPList.strings b/Zotero/Assets/lt.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/lt.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/lt.lproj/Localizable.strings b/Zotero/Assets/lt.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/lt.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/lt.lproj/Localizable.stringsdict b/Zotero/Assets/lt.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/lt.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/mk.lproj/InfoPList.strings b/Zotero/Assets/mk.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/mk.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/mk.lproj/Localizable.strings b/Zotero/Assets/mk.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/mk.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/mk.lproj/Localizable.stringsdict b/Zotero/Assets/mk.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/mk.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/mn.lproj/InfoPList.strings b/Zotero/Assets/mn.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/mn.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/mn.lproj/Localizable.strings b/Zotero/Assets/mn.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/mn.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/mn.lproj/Localizable.stringsdict b/Zotero/Assets/mn.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/mn.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/nb-NO.lproj/InfoPList.strings b/Zotero/Assets/nb-NO.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/nb-NO.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/nb-NO.lproj/Localizable.strings b/Zotero/Assets/nb-NO.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/nb-NO.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict b/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/nl.lproj/InfoPList.strings b/Zotero/Assets/nl.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/nl.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/nl.lproj/Localizable.strings b/Zotero/Assets/nl.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/nl.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/nl.lproj/Localizable.stringsdict b/Zotero/Assets/nl.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/nl.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/nn-NO.lproj/InfoPList.strings b/Zotero/Assets/nn-NO.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/nn-NO.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/nn-NO.lproj/Localizable.strings b/Zotero/Assets/nn-NO.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/nn-NO.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict b/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/oc.lproj/InfoPList.strings b/Zotero/Assets/oc.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/oc.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/oc.lproj/Localizable.strings b/Zotero/Assets/oc.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/oc.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/oc.lproj/Localizable.stringsdict b/Zotero/Assets/oc.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/oc.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/pl.lproj/InfoPList.strings b/Zotero/Assets/pl.lproj/InfoPList.strings new file mode 100644 index 000000000..7167ca9f3 --- /dev/null +++ b/Zotero/Assets/pl.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Moja biblioteka"; diff --git a/Zotero/Assets/pl.lproj/Localizable.strings b/Zotero/Assets/pl.lproj/Localizable.strings new file mode 100644 index 000000000..dd6dce7de --- /dev/null +++ b/Zotero/Assets/pl.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Zamknij"; +"delete" = "Usuń"; +"edit" = "Edycja"; +"last_updated" = "Ostatnio zaktualizowano"; +"name" = "Nazwa"; +"save" = "Zapisz"; +"creator" = "Twórca"; +"date" = "Data"; +"date_added" = "Data dodania"; +"date_modified" = "Data modyfikacji"; +"item_type" = "Rodzaj elementu"; +"publication_title" = "Publication Title"; +"publisher" = "Wydawca"; +"title" = "Tytuł"; +"year" = "Rok"; +"abstract" = "Abstrakt"; +"error" = "Błąd"; +"warning" = "Ostrzeżenie"; +"yes" = "Tak"; +"no" = "Nie"; +"cancel" = "Anuluj"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Dodaj"; +"unknown" = "Nieznany"; +"retry" = "Retry"; +"page" = "Strona"; +"report" = "Raport"; +"total" = "Total"; +"restore" = "Przywróć"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "O Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Nie znaleziono"; +"share" = "Share"; +"select" = "Wybierz"; +"create" = "Create"; +"more_information" = "Więcej informacji"; +"clear" = "Clear"; +"scan_text" = "Skanuj tekst"; +"move_to_trash" = "Przenieś do kosza"; +"size" = "Rozmiar"; +"remove" = "Usuń"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Wstecz"; +"forward" = "Naprzód"; +"go_to_settings" = "Idź do ustawień"; +"close_without_saving" = "Zamknij bez zapisywania"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Nazwa użytkownika"; +"login.password" = "Hasło"; +"login.email" = "E-mail"; +"login.repeat_password" = "Powtórz hasło"; +"login.forgot_password" = "Zapomniane hasło?"; + +"libraries.my_library" = "Moja biblioteka"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "Wszystkie elementy"; +"collections.my_publications" = "Moje publikacje"; +"collections.trash" = "Kosz"; +"collections.unfiled" = "Niepowiązane elementy"; +"collections.new_subcollection" = "Nowa podkolekcja"; +"collections.edit_title" = "Edytuj kolekcję"; +"collections.delete" = "Usuń kolekcję"; +"collections.delete_with_items" = "Usuń kolekcję i elementy"; +"collections.create_title" = "Utwórz kolekcję"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Opróżnij kosz"; +"collections.collapse_all" = "Zwiń wszystko"; +"collections.expand_all" = "Rozwiń wszystko"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Pobierz załączniki"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Wyszukaj elementy"; +"items.select_all" = "Wybierz wszystko"; +"items.deselect_all" = "Odznacz wszystko"; +"items.sort_by" = "Sortuj po"; +"items.sort_order" = "Porządek sortowania"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Dodaj plik"; +"items.remove_from_collection_title" = "Usuń z kolekcji"; +"items.action.add_to_collection" = "Dodaj do kolekcji"; +"items.action.remove_from_collection" = "Usuń z kolekcji"; +"items.action.duplicate" = "Duplikuj"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Strona"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Tytuł"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Odznacz wszystko"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Rozmiar"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Nazwa użytkownika"; +"settings.sync.password" = "Hasło"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Tytuł"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/pl.lproj/Localizable.stringsdict b/Zotero/Assets/pl.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/pl.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/pt-BR.lproj/InfoPList.strings b/Zotero/Assets/pt-BR.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/pt-BR.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/pt-BR.lproj/Localizable.strings b/Zotero/Assets/pt-BR.lproj/Localizable.strings new file mode 100644 index 000000000..d36797666 --- /dev/null +++ b/Zotero/Assets/pt-BR.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Nome"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Data"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Título"; +"year" = "Ano"; +"abstract" = "Abstract"; +"error" = "Erro"; +"warning" = "Warning"; +"yes" = "Sim"; +"no" = "Não"; +"cancel" = "Cancelar"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copiar"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Título"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Título"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict b/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/pt-PT.lproj/InfoPList.strings b/Zotero/Assets/pt-PT.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/pt-PT.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/pt-PT.lproj/Localizable.strings b/Zotero/Assets/pt-PT.lproj/Localizable.strings new file mode 100644 index 000000000..d36797666 --- /dev/null +++ b/Zotero/Assets/pt-PT.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Nome"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Data"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Título"; +"year" = "Ano"; +"abstract" = "Abstract"; +"error" = "Erro"; +"warning" = "Warning"; +"yes" = "Sim"; +"no" = "Não"; +"cancel" = "Cancelar"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copiar"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Título"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Título"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict b/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ro.lproj/InfoPList.strings b/Zotero/Assets/ro.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ro.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ro.lproj/Localizable.strings b/Zotero/Assets/ro.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ro.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ro.lproj/Localizable.stringsdict b/Zotero/Assets/ro.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ro.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ru.lproj/InfoPList.strings b/Zotero/Assets/ru.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ru.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ru.lproj/Localizable.strings b/Zotero/Assets/ru.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ru.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ru.lproj/Localizable.stringsdict b/Zotero/Assets/ru.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ru.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/sk.lproj/InfoPList.strings b/Zotero/Assets/sk.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/sk.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/sk.lproj/Localizable.strings b/Zotero/Assets/sk.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/sk.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/sk.lproj/Localizable.stringsdict b/Zotero/Assets/sk.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/sk.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/sl.lproj/InfoPList.strings b/Zotero/Assets/sl.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/sl.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/sl.lproj/Localizable.strings b/Zotero/Assets/sl.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/sl.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/sl.lproj/Localizable.stringsdict b/Zotero/Assets/sl.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/sl.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/sq.lproj/InfoPList.strings b/Zotero/Assets/sq.lproj/InfoPList.strings new file mode 100644 index 000000000..8e7342d6a --- /dev/null +++ b/Zotero/Assets/sq.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Biblioteka Ime"; diff --git a/Zotero/Assets/sq.lproj/Localizable.strings b/Zotero/Assets/sq.lproj/Localizable.strings new file mode 100644 index 000000000..0f5eb06d5 --- /dev/null +++ b/Zotero/Assets/sq.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Mbylle"; +"delete" = "Fshije"; +"edit" = "Përpunojeni"; +"last_updated" = "Përditësuar Së Fundi më"; +"name" = "Emër"; +"save" = "Ruaje"; +"creator" = "Krijues"; +"date" = "Datë"; +"date_added" = "Datë Shtimi"; +"date_modified" = "Datë Ndryshimi"; +"item_type" = "Lloj Objekti"; +"publication_title" = "Titull Botimi"; +"publisher" = "Botues"; +"title" = "Titull"; +"year" = "Vit"; +"abstract" = "Abstrakte"; +"error" = "Gabim"; +"warning" = "Sinjalizim"; +"yes" = "Po"; +"no" = "Jo"; +"cancel" = "Anuloje"; +"done" = "U bë"; +"ok" = "OK"; +"add" = "Shtoje"; +"unknown" = "E panjohur"; +"retry" = "Riprovoni"; +"page" = "Faqe"; +"report" = "Report"; +"total" = "Gjithsej"; +"restore" = "Riktheje"; +"copy" = "Kopjoje"; +"privacy_policy" = "Rregulla Privatësie"; +"support_feedback" = "Asistencë dhe Përshtypje"; +"about_zotero" = "Mbi Zotero-n"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "S’u Gjet"; +"share" = "Share"; +"select" = "Përzgjidhni"; +"create" = "Krijoje"; +"more_information" = "Më Tepër Informacion"; +"clear" = "Spastroje"; +"scan_text" = "Skanoni Tekstin"; +"move_to_trash" = "Shpjere te Hedhurina"; +"size" = "Madhësi"; +"remove" = "Hiqe"; +"keep" = "Mbaje"; +"cancel_all" = "Anuloji Krejt"; +"back" = "Mbrapsht"; +"forward" = "Përpara"; +"go_to_settings" = "Kalo te Rregullimet"; +"close_without_saving" = "Mbylle pa e ruajtur"; +"stay" = "Stay"; + +"migration_debug" = "Aplikacioni s’arriti të gatitet dhe s’mund të funksionojë si duhet. Ju lutemi, raportoni ID Diagnostikimi %@ te Forumet e Zotero-s."; +"login_debug" = "Aplikacioni s’arriti të bëjë hyrjen në llogari. Ju lutemi, ribëni hyrjen dhe raportoni ID Diagnostikimi %@ te Forumet e Zotero-s."; +"full_sync_debug" = "Njëkohësimi i plotë ka përfunduar. Ju lutemi, raportoni ID Diagnostikimi ID %@ te Forumet e Zotero-s."; + +"day_suffixes" = "Qëndro"; + +"onboarding.access" = "Zotero-ja e sistemon punën kërkimore si dëshironi. Renditini objektet tuaja në koleksione dhe shtoni për ta etiketa me fjalëkyçe."; +"onboarding.sync" = "Njëkohësoni dhe bashkëpunoni nëpër pajisje të ndryshme, duke i mbajtur të përditësuara rrjedhshëm leximet dhe shërbimet tuaja."; +"onboarding.annotate" = "Theksoni tekst dhe mbani shënime drejt e te PDF-të tuaja, teksa i lexoni."; +"onboarding.share" = "Prekeni, që të grumbulloni artikuj dhe libra drejt e nga interneti, përfshi PDF-të e tyre dhe tejtëdhëna të plota."; +"onboarding.sign_in" = "Hyni"; +"onboarding.create_account" = "Regjistrohuni"; +"login.username" = "Emër përdoruesi"; +"login.password" = "Fjalëkalim"; +"login.email" = "Email"; +"login.repeat_password" = "Përsëriteni fjalëkalimin"; +"login.forgot_password" = "Harruat Fjalëkalimin?"; + +"libraries.my_library" = "Biblioteka Ime"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Doni vërtet të fshihet “%@”?"; + +"collections.search_title" = "Gjeni Koleksion"; +"collections.all_items" = "Krejt Objektet"; +"collections.my_publications" = "Publikimet e mia"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "Nënkoleksion i Ri"; +"collections.edit_title" = "Përpunoni Koleksion"; +"collections.delete" = "Fshini Koleksionin"; +"collections.delete_with_items" = "Fshini Koleksion dhe Objekte"; +"collections.create_title" = "Krijoni Koleksion"; +"collections.picker_title" = "Zgjidhni Mëmë"; +"collections.empty_trash" = "Zbraz Hedhurina"; +"collections.collapse_all" = "Tkurri Krejt"; +"collections.expand_all" = "Zgjeroji Krejt"; +"collections.create_bibliography" = "Krijoni Bibliografi nga Koleksion"; +"collections.download_attachments" = "Shkarkoje Bashkëngjitjen"; +"collections.delete_attachment_files" = "Hiqi Shkarkimet"; + +"sync_toolbar.starting" = "Njëkohësimi filloi"; +"sync_toolbar.groups" = "Po njëkohësohen grupe"; +"sync_toolbar.groups_with_data" = "Po njëkohësohen grupe (%d / %d)"; +"sync_toolbar.library" = "Po njëkohësohet %@"; +"sync_toolbar.object" = "Po njëkohësohet %@ te %@"; +"sync_toolbar.object_with_data" = "Po njëkohësohet %@ (%d / %d) te %@"; +"sync_toolbar.finished" = "U përfundua njëkohësimi"; +"sync_toolbar.deletion" = "Po aplikohen fshirje të largëta te %@"; +"sync_toolbar.aborted" = "Njëkohësimi dështoi (%@)"; +"sync_toolbar.writes" = "Po ngarkohen ndryshime (%d / %d)"; +"sync_toolbar.uploads" = "Po ngarkohen bashkëngjitje (%d / %d)"; +"sync_toolbar.object.collections" = "koleksione"; +"sync_toolbar.object.groups" = "grupe"; +"sync_toolbar.object.items" = "objekte"; +"sync_toolbar.object.searches" = "kërkime"; + +"sync.conflict_resolution.changed_item_deleted" = "Objekti “%@” është hequr. Doni të mbahen ndryshimet tuaja?"; + +"items.search_title" = "Kërkoni objekte"; +"items.select_all" = "Përzgjidhi Krejt"; +"items.deselect_all" = "Shpërzgjidhi Krejt"; +"items.sort_by" = "Renditi Sipas"; +"items.sort_order" = "Rend Renditjeje"; +"items.ascending" = "Në rend rritës"; +"items.descending" = "Në rend zbritës"; +"items.lookup" = "Shtoni përmes Identifikuesi"; +"items.barcode" = "Skano Kod Me Vija"; +"items.new" = "Shtoni Dorazi"; +"items.new_note" = "Shënim i Ri Më Vete"; +"items.new_file" = "Shtoni Kartelë"; +"items.remove_from_collection_title" = "Hiqe prej Koleksioni"; +"items.action.add_to_collection" = "Shtoje në Koleksion"; +"items.action.remove_from_collection" = "Hiqe prej Koleksioni"; +"items.action.duplicate" = "Përsëdyte"; +"items.action.create_parent" = "Krijoni Objekt Mëmë"; +"items.action.download" = "Shkarkoje"; +"items.action.remove_download" = "Hiqe Shkarkimin"; +"items.action.retrieve_metadata" = "Merr Tejtëdhëna"; +"items.filters.title" = "Filtra"; +"items.filters.downloads" = "Kartela të Shkarkuara"; +"items.filters.tags" = "Etiketa"; +"items.toolbar_saved" = "U ruajtën %d / %d"; +"items.toolbar_downloaded" = "U shkarkuan %d / %d"; +"items.generating_bib" = "Po prodhohet Bibliografi"; +"items.creator_summary.and" = "%@ dhe %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Po merren Tejtëdhëna"; + +"lookup.title" = "Jepni ISBN-ra, DOI-ra, PMID-ra, ID-ra arXiv, ose ADS Bibcodes që të shtohet te biblioteka juaj:"; + +"citation.title" = "Paraparje Citimi"; +"citation.copy_citation" = "Kopjoje Citimin"; +"citation.copy_bibliography" = "Kopjo Bibliografinë"; +"citation.preview" = "Paraparje"; +"citation.omit_author" = "Lini Jashtë Autorin"; +"citation.locator_placeholder" = "Numër"; +"citation.locator.page" = "Faqe"; +"citation.locator.book" = "Libër"; +"citation.locator.chapter" = "Kapitull"; +"citation.locator.column" = "Shtyllë"; +"citation.locator.figure" = "Figurë"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Çështje"; +"citation.locator.line" = "Rresht"; +"citation.locator.note" = "Shënim"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraf"; +"citation.locator.part" = "Pjesë"; +"citation.locator.section" = "Seksion"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Vëllim"; +"citation.locator.verse" = "Varg"; +"citation.style" = "Stil"; +"citation.language" = "Gjuhë"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citime"; +"citation.bibliography" = "Bibliografi"; +"citation.notes" = "Shënime"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Ruaje si HTML"; +"citation.copy" = "Kopjoje në të Papastër"; + +"item_detail.add_creator" = "Shtoni Krijues"; +"item_detail.notes" = "Shënime"; +"item_detail.add_note" = "Shtoni shënim"; +"item_detail.tags" = "Etiketa"; +"item_detail.add_tag" = "Shtoni etiketë"; +"item_detail.attachments" = "Bashkëngjitje"; +"item_detail.add_attachment" = "Shtoni bashkëngjitje"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Titull"; +"item_detail.show_more" = "Shfaq më tepër"; +"item_detail.show_less" = "Shfaq më pak"; +"item_detail.view_pdf" = "Shihni PDF-në"; +"item_detail.data_reloaded" = "Ky objekt është ndryshuar së largëti. Do të ringarkohet tani."; +"item_detail.delete_attachment_file" = "Hiqe Shkarkimin"; +"item_detail.deleted_title" = "I fshirë"; +"item_detail.deleted_message" = "Ky objekt është fshirë. Doni të rikthehet?"; +"item_detail.move_to_standalone_attachment" = "Shndërroje në Bashkëngjitje Më Vete"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Emër etikete"; +"tag_picker.create_tag" = "Krijo Etiketën “%@”"; +"tag_picker.confirm_deletion_question" = "Fshi Etiketa Automatike"; +"tag_picker.search_placeholder" = "Kërkoni në Etiketa"; +"tag_picker.deselect_all" = "Shpërzgjidhi Krejt"; +"tag_picker.show_auto" = "Shfaq Etiketa Automatike"; +"tag_picker.show_all" = "Shfaq Tërë Etiketat në Këtë Bibliotekë"; +"tag_picker.delete_automatic" = "Fshi Etiketa Automatike në Këtë Bibliotekë"; + +"creator_editor.creator" = "Lloj Krijuesi"; +"creator_editor.first_name" = "Emër"; +"creator_editor.last_name" = "Mbiemër"; +"creator_editor.switch_to_single" = "Mbiemër"; +"creator_editor.switch_to_dual" = "Kalo te dy fusha"; +"creator_editor.delete_confirmation" = "Doni vërtet të fshihet ky krijues?"; + +"pdf.annotations_sidebar.search_title" = "Kërko"; +"pdf.annotations_sidebar.add_comment" = "Shtoni koment"; +"pdf.annotations_sidebar.add_tags" = "Shtoni etiketa"; +"pdf.annotations_sidebar.merge" = "Përzieji"; +"pdf.annotations_sidebar.filter.title" = "Filtroni Shënime Në Tekst"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Përzgjidhni Etiketa…"; +"pdf.search.title" = "Kërko në Dokument"; +"pdf.search.failed" = "Kërkimi dështoi"; +"pdf.search.dismiss" = "Hidhe Tej Kërkimin"; +"pdf.annotation_popover.title" = "Përpunoni Shënim Në Tekst"; +"pdf.annotation_popover.delete" = "Fshije Shënimin Në Tekst"; +"pdf.annotation_popover.update_subsequent_pages" = "Përditëso faqet pasuese"; +"pdf.annotation_popover.page_label_title" = "Përpunoni Numër Faqeje"; +"pdf.annotation_popover.no_comment" = "Pa koment"; +"pdf.annotation_popover.line_width" = "Gjerësi"; +"pdf.annotation_popover.size" = "Madhësi"; +"pdf.deleted_title" = "I fshirë"; +"pdf.deleted_message" = "Ky dokument është fshirë. Doni të rikthehet?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Theksoje"; +"pdf.underline" = "Nënvizoje"; +"pdf.annotation_share.image.share" = "Ndani figurë me të tjerët"; +"pdf.annotation_share.image.medium" = "Mesatare"; +"pdf.annotation_share.image.large" = "E madhe"; +"pdf.annotation_toolbar.eraser" = "Gomë"; +"pdf.annotation_toolbar.highlight" = "Theksoje"; +"pdf.annotation_toolbar.note" = "Shënim"; +"pdf.annotation_toolbar.image" = "Figurë"; +"pdf.annotation_toolbar.ink" = "Bojë"; +"pdf.annotation_toolbar.underline" = "Nënvizoje"; +"pdf.annotation_toolbar.text" = "Tekst"; +"pdf.locked.locked" = "E kyçur"; +"pdf.locked.enter_password" = "Që të hapet kjo PDF, ju lutemi, jepni fjalëkalimin."; +"pdf.locked.failed" = "Fjalëkalim i pasaktë. Ju lutemi, riprovoni."; +"pdf.settings.scroll_direction.title" = "Kah Rrëshqitjeje"; +"pdf.settings.scroll_direction.horizontal" = "Horizontale"; +"pdf.settings.scroll_direction.vertical" = "Vertikale"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Dukje"; +"pdf.settings.appearance.auto" = "Automatike"; +"pdf.settings.appearance.light_mode" = "E çelët"; +"pdf.settings.appearance.dark_mode" = "E errët"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Mënyrë Faqeje"; +"pdf.settings.page_mode.single" = "Njëshe"; +"pdf.settings.page_mode.double" = "Dyshe"; +"pdf.settings.page_mode.automatic" = "Automatike"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatike"; +"pdf.export.export" = "Eksportoni PDF"; +"pdf.export.export_annotated" = "Eksportoni PDF Me Shënime Në Tekst"; +"pdf.sidebar.no_annotations" = "Pa Shënime Në Tekst"; +"pdf.sidebar.no_outline" = "Pa Përvijim"; +"pdf.delete_annotation" = "Doni vërtet të fshihet ky shënim në tekst?"; +"pdf.previous_page" = "Faqja e Mëparshme"; +"pdf.next_page" = "Faqja Pasuese"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Rregullime"; +"settings.logout" = "Dilni"; +"settings.logout_warning" = "Çfarëdo të dhënash vendore që s’qenë njëkohësuar, do të fshihen. Doni vërtet të dilni?"; +"settings.general.title" = "Të përgjithshme"; +"settings.general.show_subcollections_title" = "Shfaq Objekte nga Nënkoleksione"; +"settings.general.show_collection_item_counts" = "Shfaq Madhësi Koleksionesh"; +"settings.general.open_links_in_external_browser" = "Lidhjet Hapi në Shfletues të Jashtëm"; +"settings.general.autoempty_title" = "Fshiji Objektet te Hedhurinat"; +"settings.general.never" = "Kurrë"; +"settings.item_count" = "Numër objektesh"; +"settings.item_count_subtitle" = "Shfaq numër objektesh për krejt koleksionet."; +"settings.sync.title" = "Llogari"; +"settings.sync.data_syncing" = "Njëkohësim të Dhënash"; +"settings.sync.file_syncing" = "Njëkohësim Kartelash"; +"settings.sync.file_syncing_type_message" = "Kartelat bashkëngjitje në Bibliotekën Time njëkohësoji duke përdorur"; +"settings.sync.account" = "Llogari"; +"settings.sync.manage_account" = "Administroni Llogari"; +"settings.sync.delete_account" = "Fshije Llogarinë"; +"settings.sync.username" = "Emër përdoruesi"; +"settings.sync.password" = "Fjalëkalim"; +"settings.sync.verify" = "Verifikoni Shërbyes"; +"settings.sync.directory_not_found.title" = "Drejtoria s’u gjet"; +"settings.sync.directory_not_found.message" = "%@ s’ekziston.Doni të krijohet tani?"; +"settings.sync.verified" = "U verifikua"; +"settings.permission" = "Leje Përdoruesi"; +"settings.permission_subtitle" = "Kërko për leje përdoruesi për çdo veprim shkrimi"; +"settings.translators" = "Përkthyes"; +"settings.translators_update" = "Përditëso përkthyesit"; +"settings.translators_updating" = "Po përditësohet…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Regjistrim"; +"settings.start_logging" = "Nis Regjistrim "; +"settings.start_logging_on_launch" = "Nis Regjistrim gjatë Nisjes Pasuese të Aplikacionit"; +"settings.cancel_logging" = "Anuloje Regjistrimin"; +"settings.stop_logging" = "Ndale Regjistrimin"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "Që të diagnostikoni një problem nisjeje, mbyllni aplikacionin dhe riniseni."; +"settings.logging_desc2" = "Që të diagnostikoni një problem zgjerimi për pjesë, hapni zgjerimin për pjesë."; +"settings.send_manually" = "Dërgojini Dorazi"; +"settings.log_alert.progress_title" = "Dërgim Regjistrash"; +"settings.log_alert.title" = "Regjistrat u Dërguan"; +"settings.log_alert.message" = "ID-ja juaj e Diagnostikimit është %@"; +"settings.crash_alert.title" = "Regjistrimi i Vithisjes u Dërgua"; +"settings.crash_alert.message" = "ID-ja e Raportimit tuaj është %@.Ju lutemi, postoi një mesazh te Forume Zotero (forums.zotero.org) me këtë ID Raportimi dhe çfarëdo hapash të nevojshëm për të riprodhuar vithisjen."; +"settings.crash_alert.message_with_db" = "ID-ja e Raportimit tuaj është %@.Ju lutemi, postoi një mesazh te Forume Zotero (forums.zotero.org) me këtë ID Raportimi dhe çfarëdo hapash të nevojshëm për të riprodhuar vithisjen.Nëse Zotero-ja vithiset në mënyrë të përsëritur, ju lutemi, prekni mbi “Eksportoni Bazë të Dhënash” dhe dërgojini kartelat e eksportuara te support@zotero.org."; +"settings.crash_alert.submit_forum" = "Parashtrojeni te Forume Zoteri"; +"settings.crash_alert.export_db" = "Kopjoni dhe Eksportoni Bazën e të Dhënave"; +"settings.crash_alert.copy" = "Kopjoje në të Papastër"; +"settings.websocket_title" = "Lidhje Me Shërbyes"; +"settings.websocket_connected" = "I lidhur"; +"settings.websocket_connecting" = "Po lidhet"; +"settings.websocket_disconnected" = "I shkëputur"; +"settings.websocket_disconnect" = "Shkëputu nga Shërbyesi"; +"settings.websocket_connect" = "Lidhu me Shërbyesin"; +"settings.storage" = "Depozitim Vendor"; +"settings.storage.delete_all" = "Fshi Krejt Kartelat Vendore Bashkëngjitjesh"; +"settings.storage.delete_all_question" = "Jeni i sigurt se doni të fshihen krejt kartelat bashkëngjitje prej kësaj pajisjeje?Pajisje të tjera të njëkohësuara s’do të preken."; +"settings.storage.delete_library_question" = "Jeni i sigurt se doni të fshihen krejt kartelat bashkëngjitje te %@ prej kësaj pajisjeje?Pajisje të tjera të njëkohësuara s’do të preken."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Ruaji Kartelat"; +"settings.saving.files_message" = "Kur ruhen objekte, bashkëngjit automatikisht PDF-të dhe kartela të tjera të lidhura"; +"settings.saving.tags_title" = "Ruaj Etiketa të Automatizuara"; +"settings.saving.tags_message" = "Etiketo automatikisht objekte me fjalëkyçe dhe krye subjekti"; +"settings.cite.title" = "Citoje"; +"settings.cite.styles_title" = "Stil Citimesh"; +"settings.cite.get_more_styles" = "Merrni stile shtesë"; +"settings.cite_search.search_title" = "Kërko te stilet"; +"settings.export.title" = "Kopjim i Shpejtë"; +"settings.export.default_format" = "Format Parazgjedhje"; +"settings.export.language" = "Gjuhë"; +"settings.export.copy_as_html" = "Kopjoje si HTML"; +"settings.versionAndBuild" = "Version %@ Montim %@"; +"settings.export_db" = "Eksporto Kartelë Baze të Dhënash"; +"settings.full_sync_debug" = "Të mëtejshme"; +"settings.full_sync.start" = "Nis Diagnostikim të Plotë Njëkohësimi"; +"settings.full_sync.other_in_progress" = "Ka në kryerje e sipër një njëkohësim. Ju lutemi, pritni të përfundojë."; +"settings.full_sync.in_progress" = "Ka në kryerje e sipër një njëkohësim të plotë. Ju lutemi, prisni që të përfundojë dhe postoni ID-në e Diagnostikimit te Forumet e Zotero-s."; +"settings.annotation_tools" = "Mjete Shënimi Në Tekst"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Ruaje në Zotero"; +"shareext.decoding_attachment" = "Po kërkohet për objekte"; +"shareext.translation.item_selection" = "Zgjidhni një objekt"; +"shareext.translation.translating_with" = "Po ruhet me %@"; +"shareext.loading_collections" = "Po ngarkohen Koleksione"; +"shareext.sync_error" = "S’arrihet të njëkohësohen koleksione"; +"shareext.collection_other" = "Më tepër"; +"shareext.item_title" = "Objekt"; +"shareext.collection_title" = "Koleksion"; +"shareext.tags_title" = "Etiketa"; + +"searchbar.placeholder" = "Kërko"; +"searchbar.accessibility_cancel" = "Anuloje Kërkimin"; +"searchbar.accessibility_clear" = "Spastroje Kërkimin"; + +"errors.schema" = "S\"u shkarkuan dot disa të dhëna te Biblioteka Ime. Mund të jenë ruajtur me një version më të ri të Zotero-s.Për të dhënat e tjera do të vazhdojë njëkohësimi."; +"errors.parsing" = "S’u analizuan dot disa të dhëna. Për të dhënat e tjera do të vazhdojë njëkohësimi."; +"errors.api" = "Përgjigje e dështuar API: %@"; +"errors.db" = "S’u lidh dot te bazë të dhënash. Depozita e pajisjes mund të jetë plot."; +"errors.versionMismatch" = "Gjatë njëkohësimit u bë një ndryshim i largët"; +"errors.unknown" = "Gabim i panjohur"; +"errors.attachments.cant_unzip_snapshot" = "S’arrihet të shpaketohet fotografim zip"; +"errors.attachments.incompatible_attachment" = "Në pajisje celulare s’mbulohen kartela të lidhura. Ato mund t’i hapni duke përdorur aplikacionin Zotero për desktop."; +"errors.attachments.cant_open_attachment" = "S’u gjet dot kartela e bashkëngjitur."; +"errors.attachments.missing_zotero" = "Kartela e bashkëngjitur s’është te biblioteka në internet."; +"errors.attachments.missing_webdav" = "Kartela e bashkëngjitur s’është te shërbyesi WebDAV."; +"errors.attachments.missing_additional" = "Ju lutemi, kontrolloni se kartela është njëkohësuar te pajisja ku qe shtuar."; +"errors.attachments.unauthorized_webdav" = "Shërbyesi WebDAV s’pranoi emrin e përdoruesit dhe fjalëkalimin që keni ruajtur te rregullimet."; +"errors.attachments.too_many_requests_webdav" = "Shërbyesi WebDAV po kufizon kërkesat tuaja. Riprovoni pas pak minutash, ose kontrolloni kredencialet tuaja për hyrje."; +"errors.attachments.too_many_requests" = "Shumë kërkesa. Ju lutemi, riprovoni pas pak minutash."; +"errors.attachments.forbidden_webdav" = "S’keni leje të hyni te %@ në shërbyesin WebDAV."; +"errors.attachments.generic_filename" = "kartela"; +"errors.login.invalid_password" = "Fjalëkalim i pavlefshëm"; +"errors.login.invalid_username" = "Emër përdoruesi i pavlefshëm"; +"errors.login.invalid_credentials" = "Emër përdoruesi, ose fjalëkalim i pavlefshëm"; +"errors.libraries.cantLoad" = "S’arrihet të ngarkohen biblioteka"; +"errors.collections.empty_name" = "Ju lutemi, jepni një emër koleksioni"; +"errors.collections.save_failed" = "S’arrihet të ruhet koleksion"; +"errors.collections.bibliography_failed" = "S’u ngarkuan dot objekte për bibliografi"; +"errors.sync.group_removed" = "Grupi “%@” s’është më i përdorshëm. Ç’do të donit të bënit?"; +"errors.sync.metadata_write_denied" = "S’mund të shkruani më te grupi “%@”. Ç’do të donit të bëni?"; +"errors.sync.revert_to_original" = "Riktheje te origjinali"; +"errors.sync.file_write_denied" = "S’keni më hyrje për përpunim kartelash për grupin “%@” dhe kartelat që keni ndryshuar lokalisht s’mund të ngarkohen. Nëse vazhdoni, krejt kartelat e grupit do të rikthehen në gjendjen e tyre më %@.Nëse do të donit një shans për të kopjuar gjetkë kartelat e ndryshuara, ose të kërkoni hyrje për përpunim kartelash nga një përgjegjës grupi, mund të anashkaloni tani njëkohësimin e grupit."; +"errors.sync.reset_group_files" = "Rikthe Kartela Grupi te Parazgjedhjet dhe Njëkohëso"; +"errors.sync.skip_group" = "Anashkaloje Grupin"; +"errors.sync_toolbar.finished_with_errors" = "U përfundua njëkohësimi (%@)"; +"errors.sync_toolbar.attachment_missing" = "S’arrihet të ngarkohet bashkëngjitje: %@. Ju lutemi, provoni ta hiqni dhe ta rishtoni bashkëngjitjen."; +"errors.sync_toolbar.libraries_missing" = "S’u gjetën biblioteka. Ju lutemi, bëni daljen dhe rihyni në llogari."; +"errors.sync_toolbar.groups_failed" = "S’u njëkohësuan dot grupe. Ju lutemi, riprovoni."; +"errors.sync_toolbar.conflict_retry_limit" = "Njëkohësim i largët në kryerje e sipër. Ju lutemi, riprovoni pas pak minutash."; +"errors.sync_toolbar.group_permissions" = "S’keni leje të përpunoni grupe."; +"errors.sync_toolbar.internet_connection" = "S’arrihet të lidhet te rrjeti. Ju lutemi, riprovoni."; +"errors.sync_toolbar.personal_quota_reached" = "Keni plotësuar kuotat tuaja për Depozitim Zotero. Disa kartela s’u ngarkuan. Të tjera të dhëna Zotero do të vazhdohet të njëkohësohen.Për mundësi depozitimi shtesë, shihni rregullimet e llogarisë tuaj zotero.org."; +"errors.sync_toolbar.group_quota_reached" = "Grupi “%@” ka plotësuar kuotat e tij për Depozitim Zotero. Disa kartela s’u ngarkuan. Të tjera të dhëna Zotero do të vazhdohet të njëkohësohen. I zoti i grupit mund të rrisë kapacitetin e depozitimit për grupin që nga rregullimet e tij të depozitimit, te zotero.org."; +"errors.sync_toolbar.insufficient_space" = "Keni hapësirë të pamjaftueshme në shërbyesin tuaj WebDAV. Disa kartela s’u ngarkuan. Të tjera të dhëna Zotero do të vazhdohet të njëkohësohen."; +"errors.sync_toolbar.quota_reached_short" = "U plotësuan Kuotat."; +"errors.sync_toolbar.unavailable" = "Shërbimet Zotero janë përkohësisht të papërdorshme. Ju lutemi, riprovoni, pas pak minutash."; +"errors.sync_toolbar.webdav_error" = "S’u fshinë dot kartela nga shërbyesi juaj WebDAV: “%@”."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Shfaqe Objektin"; +"errors.sync_toolbar.show_items" = "Shfaqi Objektet"; +"errors.sync_toolbar.forbidden" = "Emër përdoruesi, ose fjalëkalim i pavlefshëm"; +"errors.sync_toolbar.forbidden_message" = "Shërbyesi i njëkohësimeve Zotero s’pranoi emrin tuaj të përdoruesit dhe fjalëkalimin tuaj.Ju lutemi, bëni daljen nga llogaria dhe hyni me informacion të saktë hyrjeje."; +"errors.sync_toolbar.webdav_request_failed" = "Shërbyesi juaj WebDAV u përgjigj me një gabim HTTP %d për një kërkesë %@."; +"errors.items.loading" = "S’u ngarkuan dot objekte"; +"errors.items.deletion" = "S’u hoq dot objekti"; +"errors.items.deletion_from_collection" = "S’u hoq dot objekt prej koleksioni"; +"errors.items.add_to_collection" = "S’u shtua dot objekt te koleksioni"; +"errors.items.move_item" = "S’u lëviz dot objekti"; +"errors.items.save_note" = "S’u ruajt dot shënim"; +"errors.items.add_attachment" = "S’u shtua dot bashkëngjitje"; +"errors.items.add_some_attachments" = "Disa bashkëngjitje s’u shtuan: %@"; +"errors.items.load_duplication" = "S’u ngarkua dot objekt për përsëdytje"; +"errors.items.generating_bib" = "S’u prodhua dot bibliografi"; +"errors.citation_preview" = "S’u prodhua dot paraparje citimi"; +"errors.item_detail.dropped_fields_title" = "Ndryshoni Lloj Objekti"; +"errors.item_detail.dropped_fields_message" = "Jeni i sigurt se doni të ndryshoni llojin e objektit?Fushat vijuese do të humbasin:%@"; +"errors.item_detail.cant_load_data" = "S’u ngarkuan dot të dhëna. Ju lutemi, riprovoni."; +"errors.item_detail.cant_create_attachments_with_names" = "S’u krijua dot bashkëngjitje: %@"; +"errors.item_detail.cant_create_attachments" = "S’u krijuan dot bashkëngjitjents"; +"errors.item_detail.cant_save_note" = "S’u ruajt dot shënim"; +"errors.item_detail.cant_save_changes" = "S’u ruajtën dot ndryshimet"; +"errors.item_detail.cant_trash_item" = "S’u shpu dot objekt te hedhurinat"; +"errors.item_detail.cant_save_tags" = "S’u ruajtën dot etiketa"; +"errors.item_detail.unsupported_type" = "Lloji “%@” s’mbulohet"; +"errors.settings.storage" = "S’u grumbulluan dot të dhëna depozitim"; +"errors.settings.webdav.file_missing_after_upload" = "U gjet një problem potencial me shërbyesin tuaj WebDAV.Një kartelë e ngarkuar s’qe menjëherë gati për shkarkim. Mund të ketë një vonesë të shkurtër mes kohës kur ngarkoni kartela dhe kur ato janë gati për përdorim, veçanërisht nëse po përdorni një shërbim depozitimi në re.Nëse njëkohësimi Zotero i kartelave duket se funksionon normalisht, mund ta shpërfillni këtë mesazh. Nëse keni problem, ju lutemi, postoni te Forumet e Zotero-s."; +"errors.settings.webdav.invalid_url" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.no_password" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.no_url" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.no_username" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.non_existent_file_not_missing" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.not_dav" = "S’është URL WebDAV e vlefshme"; +"errors.settings.webdav.parent_dir_not_found" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.zotero_dir_not_found" = "Gabim verifikimi WebDAV"; +"errors.settings.webdav.unauthorized" = "Shërbyesi WebDAV s’pranoi emrin e përdoruesit dhe fjalëkalimin që dhatë."; +"errors.settings.webdav.forbidden" = "S’keni leje të hyni te dosja e dhënë në shërbyesin WebDAV."; +"errors.settings.webdav.internet_connection" = "S’arrihet të lidhet te rrjeti. Ju lutemi, riprovoni."; +"errors.settings.webdav.host_not_found" = "S’u lidh dot te shërbyes WebDAV"; +"errors.settings.webdav.ats" = "Për shkak kufizimesh nga iOS, duhet të përdorni HTTPS që të lidheni te një shërbyes WebDAV jo vendor."; +"errors.shareext.logged_out" = "Ju lutemi, bëni hyrje te llogari aplikacioni, para se të përdorni këtë zgjerim."; +"errors.shareext.cant_load_data" = "S’u arrit të ngarkohen të dhëna. Ju lutemi, riprovoni."; +"errors.shareext.unknown" = "Ndodhi një gabim i panjohur."; +"errors.shareext.cant_load_schema" = "Ndodhi një gabim. Ju lutemi, hapni aplikacionin Zotero, bëni njëkohësimin dhe riprovoni."; +"errors.shareext.download_failed" = "S’u shkarkua dot kartela"; +"errors.shareext.items_not_found" = "S’u gjetën objekte te faqja"; +"errors.shareext.schema_error" = "Ca të dhëna s’u shkarkuan dot. Mund të jenë ruajtur me një version Zotero-je më të ri."; +"errors.shareext.translation_failed" = "Ruajtja dështoi"; +"errors.shareext.response_missing_data" = "Ndodhi një gabim. Ju lutemi, riprovoni."; +"errors.shareext.failed_additional" = "Mundeni prapëseprapë ta ruani këtë faqe si një objekt “webpage”."; +"errors.shareext.file_not_pdf" = "S’arrihet të ruhet PDF-ja"; +"errors.shareext.api_error" = "Gabim në ngarkim objekti. Objekti qe ruajtur te biblioteka juaj vendore."; +"errors.shareext.webdav_error" = "Gabim ngarkimi bashkëngjitjeje te shërbyes WebDAV"; +"errors.shareext.personal_quota_reached" = "Keni plotësuar kuotat tuaja Depozitim Zotero dhe kartela s’mund të ngarkohet. Për mundësi depozitimi shtesë, shihni rregullimet e llogarisë tuaj.Kartela u ruajt te biblioteka juaj vendore."; +"errors.shareext.group_quota_reached" = "Për grupin “%@” janë plotësuar kuotat e tij për Depozitim Zotero dhe kartela s’u ngarkua dot. I zoti i grupit mund të shohë rregullimet e llogarive përkatëse për mundësi shtesë depozitimi.Kartela u ruajt te biblioteka vendore."; +"errors.shareext.forbidden" = "S’keni lejet e nevojshme për të shtuar këtë objekt te %@."; +"errors.shareext.webdav_not_verified" = "Gabim verifikimi WebDAV"; +"errors.shareext.requires_browser" = "Kjo lëndë mund të ngarkohet në një shfletues, që të ndahet me Zotero. Hapeni në shfletuesin tuaj dhe përdorni butonin “Ndajeni me të tjerë” të shfletuesit tuaj."; +"errors.db_failure" = "Gabim në krijimin e bazës së të dhënave. Ju lutemi, provoni të ribëni hyrjen."; +"errors.logging.title" = "Gabim Diagnostikimi"; +"errors.logging.start" = "S’arrihet të niset regjistrim diagnostikimi"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "S’u përditësuan dot regjistra. Ju lutemi, riprovoni."; +"errors.logging.response_parsing" = "Përgjigje nga shërbyesi e papritur"; +"errors.translators.bundle_loading" = "S’u përditësuan dot përkthyesit. Të riprovohet?"; +"errors.styles.addition" = "S’u shtua dot stili “%@”"; +"errors.styles.deletion" = "S’u fshi dot stili “%@”"; +"errors.styles.loading" = "S’u ngarkuan dot stile"; +"errors.styles_search.loading" = "S’u ngarkuan dot stile. Të riprovohet?"; +"errors.citation.generate_citation" = "S’u prodhua dot citim"; +"errors.citation.generate_bibliography" = "S’u prodhua dot bibliografi"; +"errors.citation.invalid_types" = "U përzgjodhën lloje të pavlefshmëm objektesh"; +"errors.citation.missing_style" = "S’u përzgjodh stil citimesh. Kaloni te Rregullime → Kopjim i Shpejtë dhe përzgjidhni një stil të ri."; +"errors.citation.open_settings" = "Hap Rregullimet"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero-ja s’gjeti dot ndonjë identifikues në atë çka dhatë. Ju lutemi, verifikoni ç’dhatë dhe riprovoni."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero-ja s’gjeti dot ndonjë identifikues në ç’dhatë, ose ata janë shtuar tashmë. Ju lutemi, verifikoni ç’dhatë dhe riprovoni."; +"errors.pdf.merge_too_big_title" = "S’arrihet të përzihen shënime në tekst"; +"errors.pdf.merge_too_big" = "Shënimi në tekst i ndërthurur do të ishte shumë i madh."; +"errors.pdf.cant_update_annotation" = "S’përditësohet dot shënim në tekst"; +"errors.pdf.cant_add_annotations" = "S’shtohen dot shënime në tekst"; +"errors.pdf.cant_delete_annotations" = "S’fshihen dot shënime në tekst"; +"errors.pdf.incompatible_document" = "Ky dokument s’mbulohet."; +"errors.pdf.empty_document" = "Ky dokument është i zbrazët."; +"errors.pdf.page_index_not_int" = "Format i pasaktë i faqes së depozituar për këtë dokument"; +"errors.pdf.document_changed" = "Ky dokument është ndryshuar në një tjetër pajisje. Ju lutemi, rihapeni që të vazhdoni përpunimin."; + +"accessibility.untitled" = "Titull"; +"accessibility.locked" = "E kyçur"; +"accessibility.archived" = "I arkivuar"; +"accessibility.collections.items" = "objekte"; +"accessibility.collections.expand" = "Zgjeroje"; +"accessibility.collections.collapse" = "Tkurre"; +"accessibility.collections.create_collection" = "Krijoni koleksion"; +"accessibility.collections.search_collections" = "Kërkoni në koleksione"; +"accessibility.collections.expand_all_collections" = "Zgjeroji krejt koleksionet"; +"accessibility.items.open_item" = "Hap hollësi objekti"; +"accessibility.items.select_items" = "Përzgjidhni objekte"; +"accessibility.items.select_all_items" = "Përzgjidhi Krejt Objektet"; +"accessibility.items.deselect_all_items" = "Shpërzgjidhi Krejt Objektet"; +"accessibility.items.filter_items" = "Filtroni objekte"; +"accessibility.items.sort_items" = "Renditini objektet"; +"accessibility.items.add_to_collection" = "Shtoji objektet e përzgjedhur te koleksion"; +"accessibility.items.remove_from_collection" = "Hiqi objektet e përzgjedhur nga koleksioni"; +"accessibility.items.trash" = "Shpjeri objektet e përzgjedhur te hedhurinat"; +"accessibility.items.delete" = "Fshiji objektet e përzgjedhur"; +"accessibility.items.restore" = "Rikthe objektet e përzgjedhur"; +"accessibility.items.duplicate" = "Përsëdyt objektin e përzgjedhur"; +"accessibility.items.share" = "Ndani me të tjerë objektet e përzgjedhur"; +"accessibility.items.download_attachments" = "Shkarkoni bashkëngjitje për objektet e përzgjedhur"; +"accessibility.items.remove_downloads" = "Hiqi shkarkimet për objektet e përzgjedhur"; +"accessibility.items.collection" = "Koleksion"; +"accessibility.item_detail.download_and_open" = "Prekeni dy herë që të shkarkohet dhe ta hapni"; +"accessibility.item_detail.open" = "Prekeni dy herë që ta hapni"; +"accessibility.pdf.sidebar_open" = "Hap anështyllë"; +"accessibility.pdf.sidebar_close" = "Mbylle anështyllën"; +"accessibility.pdf.share" = "Ndani PDF me të tjerë"; +"accessibility.pdf.export" = "Eksportoni PDF"; +"accessibility.pdf.export_annotated" = "Eksportoni PDF me shënime në tekst"; +"accessibility.pdf.settings" = "Rregullime"; +"accessibility.pdf.color_picker" = "Zgjedhës ngjyrash"; +"accessibility.pdf.highlight_annotation_tool" = "Krijoni shënim në tekst me theksim"; +"accessibility.pdf.note_annotation_tool" = "Krijoni shënim në tekst te shënim"; +"accessibility.pdf.image_annotation_tool" = "Krijoni shënim në tekst te figurë"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Krijoni shënim në tekst me nënvijë"; +"accessibility.pdf.text_annotation_tool" = "Krijoni shënim në tekst"; +"accessibility.pdf.eraser_annotation_tool" = "Gomë"; +"accessibility.pdf.highlight_annotation" = "Thekso shënim në tekst"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Shënim tekst në figurë"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Nënvizojeni shënimin në tekst"; +"accessibility.pdf.text_annotation" = "Shënim në tekst"; +"accessibility.pdf.edit_annotation" = "Përpunoni shënim në tekst"; +"accessibility.pdf.share_annotation" = "Ndani me të tjerët shënim në tekst"; +"accessibility.pdf.share_annotation_image" = "Ndani me të tjerët figurë shënimi në tekst"; +"accessibility.pdf.eraser_annotation" = "Gomë"; +"accessibility.pdf.highlighted_text" = "Tekst i theksuar"; +"accessibility.pdf.underlined_text" = "Tekst i nënvijëzuar"; +"accessibility.pdf.author" = "Autor"; +"accessibility.pdf.comment" = "Koment"; +"accessibility.pdf.tags" = "Etiketa"; +"accessibility.pdf.annotation_hint" = "Prekeni dy herë që ta përzgjidhni dhe përpunoni"; +"accessibility.pdf.tags_hint" = "Prekeni dy herë që të përpunoni etiketa"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Ribëje"; +"accessibility.pdf.undo" = "Zhbëje"; +"accessibility.pdf.toggle_annotation_toolbar" = "Shfaqni/fshihni panel shënimesh në tekst"; +"accessibility.pdf.show_more_tools" = "Shfaq më tepër"; +"accessibility.htmlepub.search_html" = "Kërko në Sajt"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Filloni të flisni"; +"accessibility.speech.pause" = "Ndaleni të folurën"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Lexoni Me Zë"; +"accessibility.show_reader" = "Mënyra Lexim"; +"accessibility.show_reader_accessibility_label" = "Kalo te mënyra lexim"; +"accessibility.show_speech" = "Lexoni Me Zë"; +"accessibility.show_speech_accessibility_label" = "Filloni të lexoni me zë"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/sq.lproj/Localizable.stringsdict b/Zotero/Assets/sq.lproj/Localizable.stringsdict new file mode 100644 index 000000000..b4bcab9ac --- /dev/null +++ b/Zotero/Assets/sq.lproj/Localizable.stringsdict @@ -0,0 +1,213 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + U përzgjodh 1 Koleksion + other + U përzgjodhën %d Koleksione + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Jeni i sigurt se doni të fshihet objekti i përzgjedhur? + other + Jeni i sigurt se doni të fshihen objektet e përzgjedhur? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Jeni i sigurt se doni të hiqet nga ky koleksion objekti i përzgjedhur? + other + Jeni i sigurt se doni të hiqen nga ky koleksion objektet e përzgjedhur? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filtro 1 objekt + other + Filtro %d objekte + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + U gjet 1 përkim + other + U gjetën %d përkime + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 kartelë (%.2f %@) + other + %d kartela (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 problem + other + %d probleme + + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + U përzgjodh 1 etiketë + other + U përzgjodhën %d etiketa + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Jeni i sigurt se doni të fshihet 1 etiketë automatike në këtë bibliotekë?\n\nKy veprim s’mund të zhbëhet. + other + Jeni i sigurt se doni të fshihen %d etiketa automatike në këtë bibliotekë?\n\nKy veprim s’mund të zhbëhet. + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + U regjistrua 1 rresht + other + U regjistruan %d rreshta + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 rresht + other + %d rreshta + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + S’u fshi dot 1 kartelë nga shërbyesi juaj WebDAV + other + S’u fshinë dot %d kartela nga shërbyesi juaj WebDAV + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Pas 1 Dite + other + Pas %d Ditësh + + + + diff --git a/Zotero/Assets/sr.lproj/InfoPList.strings b/Zotero/Assets/sr.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/sr.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/sr.lproj/Localizable.strings b/Zotero/Assets/sr.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/sr.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/sr.lproj/Localizable.stringsdict b/Zotero/Assets/sr.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/sr.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/sv.lproj/InfoPList.strings b/Zotero/Assets/sv.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/sv.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/sv.lproj/Localizable.strings b/Zotero/Assets/sv.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/sv.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/sv.lproj/Localizable.stringsdict b/Zotero/Assets/sv.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/sv.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/ta.lproj/InfoPList.strings b/Zotero/Assets/ta.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/ta.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/ta.lproj/Localizable.strings b/Zotero/Assets/ta.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/ta.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/ta.lproj/Localizable.stringsdict b/Zotero/Assets/ta.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/ta.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/th.lproj/InfoPList.strings b/Zotero/Assets/th.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/th.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/th.lproj/Localizable.strings b/Zotero/Assets/th.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/th.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/th.lproj/Localizable.stringsdict b/Zotero/Assets/th.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/th.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/tr.lproj/InfoPList.strings b/Zotero/Assets/tr.lproj/InfoPList.strings new file mode 100644 index 000000000..ce0dbe69c --- /dev/null +++ b/Zotero/Assets/tr.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "Kitaplığım"; diff --git a/Zotero/Assets/tr.lproj/Localizable.strings b/Zotero/Assets/tr.lproj/Localizable.strings new file mode 100644 index 000000000..0a95939e2 --- /dev/null +++ b/Zotero/Assets/tr.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Kapat"; +"delete" = "Sil"; +"edit" = "Düzenle"; +"last_updated" = "Son Güncellenme"; +"name" = "Ad"; +"save" = "Kaydet"; +"creator" = "Oluşturan"; +"date" = "Tarih"; +"date_added" = "Eklendiği Tarih"; +"date_modified" = "Değiştirildiği Tarih"; +"item_type" = "Eser Türü"; +"publication_title" = "Yayın Başlığı"; +"publisher" = "Yayıncı"; +"title" = "Başlık"; +"year" = "Yıl"; +"abstract" = "Öz"; +"error" = "Hata"; +"warning" = "Uyarı"; +"yes" = "Evet"; +"no" = "ayır"; +"cancel" = "İptal"; +"done" = "Tamamlandı"; +"ok" = "Tamam"; +"add" = "Ekle"; +"unknown" = "ilinmiyor"; +"retry" = "Yeniden Dene"; +"page" = "Sayfa"; +"report" = "Raporla"; +"total" = "Toplam"; +"restore" = "Geri Al"; +"copy" = "Kopyala"; +"privacy_policy" = "Gizililk Politikası"; +"support_feedback" = "Yardım ve Geri Bildirim"; +"about_zotero" = "Zotero Hakkında"; +"recent" = "Recents"; +"look_up" = "Ara"; +"not_found" = "Bulunamadı"; +"share" = "Paylaş"; +"select" = "Seç"; +"create" = "Oluştur"; +"more_information" = "Daha Fazla Bilgi"; +"clear" = "Temizle"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Çöp Sepetine Gönder"; +"size" = "Boyut"; +"remove" = "Kaldır"; +"keep" = "Sakla"; +"cancel_all" = "Tümüni İptal Et"; +"back" = "Geri"; +"forward" = "eri"; +"go_to_settings" = "Ayalara Git"; +"close_without_saving" = "Kaydetmeden kapat"; +"stay" = "Kal"; + +"migration_debug" = "Uygulama başlatılamadı ve düzgün çalışmıyor. Lütfen Hata Kimlik Numarasını %@ Zotero Forumu'nda paylaşın."; +"login_debug" = "Uygulama başlatılamadı. Lütfen yeniden giriş yapın ve Hata Kimlik Numarasını %@ Zotero Forumu'nda paylaşın."; +"full_sync_debug" = "Eşitleme tamamlandı. Lütfen Hata Kimlik Numarasını %@ Zotero Forumu'nda paylaşın."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero araştırmayı dilediğiniz gibi düzenler. Eserlerinizi dermelerde toplayın ve anahtar kelimelerle etiketleyin."; +"onboarding.sync" = "Okumalarınızı ve notlarınızı cihazlarınız arasında zahmetsizce güncel tutarakeşitleyin ve başkalarıyla birlikte çalışın. "; +"onboarding.annotate" = "PDFlerinizi okurken doğrudan üzerlerineişaretlemeler yapın ve notlar alın. "; +"onboarding.share" = "İnternetten makale ve kitapların PDF ve tüm üstverilerini çekmek içintıklayın. "; +"onboarding.sign_in" = "Giriş Yap"; +"onboarding.create_account" = "Kaydol"; +"login.username" = "Kullanıcı Adı"; +"login.password" = "Şifre"; +"login.email" = "E-posta"; +"login.repeat_password" = "Şifreyi yinele"; +"login.forgot_password" = "Şifremi Unuttum"; + +"libraries.my_library" = "Kitaplığım"; +"libraries.group_libraries" = "Grup Kitaplıkları"; +"libraries.delete_question" = "Bunu \"%@@\" silmek istediğinize emin misiniz?"; + +"collections.search_title" = "Derme Ara"; +"collections.all_items" = "Tüm Eserler"; +"collections.my_publications" = "Yayınlarım"; +"collections.trash" = "Çöp Sepeti"; +"collections.unfiled" = "Dosyalanmamış Eserler"; +"collections.new_subcollection" = "Yeni Alt Derme"; +"collections.edit_title" = "Dermeyi Düzenle"; +"collections.delete" = "Dermeyi Sil"; +"collections.delete_with_items" = "Dermeyi ve Eserleri Sil"; +"collections.create_title" = "Derme Oluştur"; +"collections.picker_title" = "Ana Eseri Seç"; +"collections.empty_trash" = "Çöp Sepetini Boşalt"; +"collections.collapse_all" = "Hepsini Daralt"; +"collections.expand_all" = "Hepsini Genişlet"; +"collections.create_bibliography" = "Dermeden Kaynakça Oluştur"; +"collections.download_attachments" = "Ek Dosyaları İndir"; +"collections.delete_attachment_files" = "İndirmeleri Kaldır"; + +"sync_toolbar.starting" = "Eşitleme başlıyor"; +"sync_toolbar.groups" = "Gruplar eşitleniyor"; +"sync_toolbar.groups_with_data" = "Gruplar eşitleniyor (%d / %d)"; +"sync_toolbar.library" = "Eşitleniyor %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Eşitleme tamamlandı"; +"sync_toolbar.deletion" = "%@ içindeki uzaktan silmeler işleniyor"; +"sync_toolbar.aborted" = "Eşitleme başarısız oldu (%@)"; +"sync_toolbar.writes" = "Değişiklikler yükleniyor (%d / %d)"; +"sync_toolbar.uploads" = "Ek yükleniyor (%d / %d)"; +"sync_toolbar.object.collections" = "dermeler"; +"sync_toolbar.object.groups" = "gruplar"; +"sync_toolbar.object.items" = "eserler"; +"sync_toolbar.object.searches" = "aramalar"; + +"sync.conflict_resolution.changed_item_deleted" = "\"%@\" eseri kaldırıldı. Değişiklikleri tutmak istiyor musunuz?"; + +"items.search_title" = "Eserleri Ara"; +"items.select_all" = "Hepsini Seç"; +"items.deselect_all" = "Hepsinin Seçimini Kaldır"; +"items.sort_by" = "Sırala"; +"items.sort_order" = "Sıralama Düzeni"; +"items.ascending" = "Artan"; +"items.descending" = "Azalan"; +"items.lookup" = "Eserleri Tanımlayıcı Kullanarak Ekle "; +"items.barcode" = "Barkod Tara"; +"items.new" = "Elle Ekle"; +"items.new_note" = "Yeni Bağımsız Not"; +"items.new_file" = "Dosya Ekle"; +"items.remove_from_collection_title" = "Dermeden Kaldır"; +"items.action.add_to_collection" = "Dermeye Ekle"; +"items.action.remove_from_collection" = "Dermeden Kaldır"; +"items.action.duplicate" = "Çoğalt"; +"items.action.create_parent" = "Ana Eser Oluştur"; +"items.action.download" = "İndir"; +"items.action.remove_download" = "İndirmeyi Sil"; +"items.action.retrieve_metadata" = "Üstveriyi Al"; +"items.filters.title" = "Filtreler"; +"items.filters.downloads" = "İndirilen Dosyalar"; +"items.filters.tags" = "Etiketler"; +"items.toolbar_saved" = "%d / %d kaydedildi."; +"items.toolbar_downloaded" = "%d / %d indirildi."; +"items.generating_bib" = "Kaynakça Oluşturuluyor"; +"items.creator_summary.and" = "%@ ve %@"; +"items.creator_summary.etal" = "%@ vd."; +"items.retrieving_metadata" = "Üstveri Alınıyor"; + +"lookup.title" = "ISBN, DOI, PMID, arXiv ID ya da ADB Bibcode tanımlayılarını girerek kitaplığınıza ekleyin:"; + +"citation.title" = "Kaynakça Ön İzlemesi"; +"citation.copy_citation" = "Alıntı Kopyala"; +"citation.copy_bibliography" = "Kaynakça Kopyala"; +"citation.preview" = "Ön İzleme"; +"citation.omit_author" = "Y"; +"citation.locator_placeholder" = "Sayı"; +"citation.locator.page" = "Sayfa"; +"citation.locator.book" = "Kitap"; +"citation.locator.chapter" = "Bölüm"; +"citation.locator.column" = "Sütun"; +"citation.locator.figure" = "Şekil"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Say"; +"citation.locator.line" = "Satır"; +"citation.locator.note" = "Not"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraf"; +"citation.locator.part" = "Parça"; +"citation.locator.section" = "Kısım"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Cilt"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Biçim"; +"citation.language" = "Di"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Alıntılar"; +"citation.bibliography" = "Kaynakça"; +"citation.notes" = "Notlar"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "HTML olarak kaydet"; +"citation.copy" = "Panoya Kopyala"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notlar"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Etiketler"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Başlık"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "İndirmeyi Sil"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Hepsinin Seçimini Kaldır"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Boyut"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Not"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Kullanıcı Adı"; +"settings.sync.password" = "Şifre"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Panoya Kopyala"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Di"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Etiketler"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Başlık"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "eserler"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Etiketler"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/tr.lproj/Localizable.stringsdict b/Zotero/Assets/tr.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/tr.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/uk.lproj/InfoPList.strings b/Zotero/Assets/uk.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/uk.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/uk.lproj/Localizable.strings b/Zotero/Assets/uk.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/uk.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/uk.lproj/Localizable.stringsdict b/Zotero/Assets/uk.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/uk.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/vi.lproj/InfoPList.strings b/Zotero/Assets/vi.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/vi.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/vi.lproj/Localizable.strings b/Zotero/Assets/vi.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/vi.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/vi.lproj/Localizable.stringsdict b/Zotero/Assets/vi.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/vi.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/yue-Hans.lproj/InfoPList.strings b/Zotero/Assets/yue-Hans.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/yue-Hans.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/yue-Hans.lproj/Localizable.strings b/Zotero/Assets/yue-Hans.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/yue-Hans.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict b/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + diff --git a/Zotero/Assets/zh-Hans.lproj/InfoPList.strings b/Zotero/Assets/zh-Hans.lproj/InfoPList.strings new file mode 100644 index 000000000..674be6b4a --- /dev/null +++ b/Zotero/Assets/zh-Hans.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "我的文库"; diff --git a/Zotero/Assets/zh-Hans.lproj/Localizable.strings b/Zotero/Assets/zh-Hans.lproj/Localizable.strings new file mode 100644 index 000000000..bbbaaa1d3 --- /dev/null +++ b/Zotero/Assets/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "关闭"; +"delete" = "删除"; +"edit" = "编辑"; +"last_updated" = "最后更新"; +"name" = "姓名"; +"save" = "保存"; +"creator" = "创建者"; +"date" = "日期"; +"date_added" = "添加日期"; +"date_modified" = "修改日期"; +"item_type" = "条目类型"; +"publication_title" = "出版物"; +"publisher" = "出版社"; +"title" = "标题"; +"year" = "年"; +"abstract" = "摘要"; +"error" = "错误"; +"warning" = "警告"; +"yes" = "是"; +"no" = "否"; +"cancel" = "取消"; +"done" = "完成"; +"ok" = "好的"; +"add" = "添加"; +"unknown" = "未知"; +"retry" = "重试"; +"page" = "页码"; +"report" = "报告"; +"total" = "Total"; +"restore" = "恢复"; +"copy" = "复制"; +"privacy_policy" = "隐私政策"; +"support_feedback" = "支持与反馈"; +"about_zotero" = "关于 Zotero"; +"recent" = "最近"; +"look_up" = "查找"; +"not_found" = "未找到"; +"share" = "分享"; +"select" = "选择"; +"create" = "创建"; +"more_information" = "更多信息"; +"clear" = "清除"; +"scan_text" = "Scan Text"; +"move_to_trash" = "删除"; +"size" = "大小"; +"remove" = "移除"; +"keep" = "保持"; +"cancel_all" = "取消全部"; +"back" = "返回"; +"forward" = "前进"; +"go_to_settings" = "前往设置"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "应用程序初始化失败,无法正常运行。请在 Zotero 论坛中报告调试 ID %@ 。"; +"login_debug" = "应用程序登录失败。请重新登录并在 Zotero 论坛中报告调试 ID %@ 。"; +"full_sync_debug" = "完全同步已完成。请在 Zotero 论坛中报告调试 ID %@。"; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero 以你喜欢的方式管理研究 将你的条目整理到分类中,并用关键字标记它们。"; +"onboarding.sync" = "跨设备同步和协作,无缝保持您的阅读进度与笔记为最新。"; +"onboarding.annotate" = "在您阅读 PDF 时直接在其中高亮并做笔记。"; +"onboarding.share" = "直接从互联网点击以收录文章和书籍,包括它们的 PDF 文件和完整元数据。"; +"onboarding.sign_in" = "登录"; +"onboarding.create_account" = "注册"; +"login.username" = "用户名"; +"login.password" = "密码"; +"login.email" = "邮箱"; +"login.repeat_password" = "再次输入密码"; +"login.forgot_password" = "忘记密码?"; + +"libraries.my_library" = "我的文库"; +"libraries.group_libraries" = "群组文库"; +"libraries.delete_question" = "确定要删除 “%@” 吗?"; + +"collections.search_title" = "查找分类"; +"collections.all_items" = "所有条目"; +"collections.my_publications" = "我的出版物"; +"collections.trash" = "回收站"; +"collections.unfiled" = "未分类条目"; +"collections.new_subcollection" = "新建子分类"; +"collections.edit_title" = "编辑分类"; +"collections.delete" = "删除分类"; +"collections.delete_with_items" = "删除分类及条目"; +"collections.create_title" = "新建分类"; +"collections.picker_title" = "选择上级条目"; +"collections.empty_trash" = "清空回收站"; +"collections.collapse_all" = "折叠所有"; +"collections.expand_all" = "展开所有"; +"collections.create_bibliography" = "用分类创建文献表"; +"collections.download_attachments" = "下载附件"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "同步开始"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "同步完成"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "分类"; +"sync_toolbar.object.groups" = "群组"; +"sync_toolbar.object.items" = "条目"; +"sync_toolbar.object.searches" = "搜索"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "升序"; +"items.descending" = "降序"; +"items.lookup" = "通过标识符添加"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "从分类中移除"; +"items.action.add_to_collection" = "添加到分类"; +"items.action.remove_from_collection" = "从分类中移除"; +"items.action.duplicate" = "创建副本"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "下载"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "标签"; +"items.toolbar_saved" = "已保存 %d / %d"; +"items.toolbar_downloaded" = "已下载 %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "复制引注"; +"citation.copy_bibliography" = "复制参考文献表"; +"citation.preview" = "预览"; +"citation.omit_author" = "省略作者"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "页面"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "笔记"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "引注"; +"citation.bibliography" = "参考文献表"; +"citation.notes" = "笔记"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "保存为 HTML"; +"citation.copy" = "复制到剪切板"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "笔记"; +"item_detail.add_note" = "添加笔记"; +"item_detail.tags" = "标签"; +"item_detail.add_tag" = "添加标签"; +"item_detail.attachments" = "附件"; +"item_detail.add_attachment" = "添加附件"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "标题"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "查看 PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "已选中 %d"; +"tag_picker.placeholder" = "标签名"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "名字"; +"creator_editor.last_name" = "姓氏"; +"creator_editor.switch_to_single" = "显示一个输入框"; +"creator_editor.switch_to_dual" = "显示两个输入框"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "添加标签"; +"pdf.annotations_sidebar.merge" = "合并"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "选择标签…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "大小"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "高亮"; +"pdf.underline" = "下划线"; +"pdf.annotation_share.image.share" = "分享图片"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "高亮"; +"pdf.annotation_toolbar.note" = "笔记"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "下划线"; +"pdf.annotation_toolbar.text" = "文本"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "请输入密码以打开此 PDF。"; +"pdf.locked.failed" = "密码错误。请重试。"; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "横向"; +"pdf.settings.scroll_direction.vertical" = "竖向"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "用户名"; +"settings.sync.password" = "密码"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "复制到剪切板"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "标签"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "标题"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "条目"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "标签"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict b/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict new file mode 100644 index 000000000..61cf2bbd9 --- /dev/null +++ b/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict @@ -0,0 +1,178 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 已选中 %d 个分类 + + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 确定要删除选中的条目? + + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 确定要从此分类中删除选中的条目吗? + + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 筛选:%d 个条目 + + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 找到 %d 个匹配项 + + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + %d 个文件 (%.2f %@) + + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 已选中 %d 个标签 + + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 确定要删除此文库中的 %d 个自动标签吗?\n\n该操作无法撤消。 + + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 已记录 %d 行 + + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + %d 行 + + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + 无法从 WebDAV 服务器中删除 %d 个文件 + + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + other + %d 天后 + + + + diff --git a/Zotero/Assets/zh-Hant.lproj/InfoPList.strings b/Zotero/Assets/zh-Hant.lproj/InfoPList.strings new file mode 100644 index 000000000..3b0b49013 --- /dev/null +++ b/Zotero/Assets/zh-Hant.lproj/InfoPList.strings @@ -0,0 +1,9 @@ +/* + InfoPlist.strings + Zotero + + Created by Miltiadis Vasilakis on 5/6/24. + Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. +*/ + +"my_library" = "My Library"; diff --git a/Zotero/Assets/zh-Hant.lproj/Localizable.strings b/Zotero/Assets/zh-Hant.lproj/Localizable.strings new file mode 100644 index 000000000..48355def2 --- /dev/null +++ b/Zotero/Assets/zh-Hant.lproj/Localizable.strings @@ -0,0 +1,592 @@ +/* + Localizable.strings + Zotero + + Created by Michal Rentka on 21/04/2020. + Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. +*/ + +"close" = "Close"; +"delete" = "Delete"; +"edit" = "Edit"; +"last_updated" = "Last Updated"; +"name" = "Name"; +"save" = "Save"; +"creator" = "Creator"; +"date" = "Date"; +"date_added" = "Date Added"; +"date_modified" = "Date Modified"; +"item_type" = "Item Type"; +"publication_title" = "Publication Title"; +"publisher" = "Publisher"; +"title" = "Title"; +"year" = "Year"; +"abstract" = "Abstract"; +"error" = "Error"; +"warning" = "Warning"; +"yes" = "Yes"; +"no" = "No"; +"cancel" = "Cancel"; +"done" = "Done"; +"ok" = "OK"; +"add" = "Add"; +"unknown" = "Unknown"; +"retry" = "Retry"; +"page" = "Page"; +"report" = "Report"; +"total" = "Total"; +"restore" = "Restore"; +"copy" = "Copy"; +"privacy_policy" = "Privacy Policy"; +"support_feedback" = "Support and Feedback"; +"about_zotero" = "About Zotero"; +"recent" = "Recents"; +"look_up" = "Look Up"; +"not_found" = "Not Found"; +"share" = "Share"; +"select" = "Select"; +"create" = "Create"; +"more_information" = "More Information"; +"clear" = "Clear"; +"scan_text" = "Scan Text"; +"move_to_trash" = "Move to Trash"; +"size" = "Size"; +"remove" = "Remove"; +"keep" = "Keep"; +"cancel_all" = "Cancel All"; +"back" = "Back"; +"forward" = "Forward"; +"go_to_settings" = "Go to Settings"; +"close_without_saving" = "Close without saving"; +"stay" = "Stay"; + +"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; +"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; +"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; + +"day_suffixes" = "st,nd,rd,th"; + +"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; +"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; +"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; +"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sign_in" = "Sign In"; +"onboarding.create_account" = "Sign Up"; +"login.username" = "Username"; +"login.password" = "Password"; +"login.email" = "Email"; +"login.repeat_password" = "Repeat password"; +"login.forgot_password" = "Forgot Password?"; + +"libraries.my_library" = "My Library"; +"libraries.group_libraries" = "Group Libraries"; +"libraries.delete_question" = "Do you really want to delete “%@”?"; + +"collections.search_title" = "Find Collection"; +"collections.all_items" = "All Items"; +"collections.my_publications" = "My Publications"; +"collections.trash" = "Trash"; +"collections.unfiled" = "Unfiled Items"; +"collections.new_subcollection" = "New Subcollection"; +"collections.edit_title" = "Edit Collection"; +"collections.delete" = "Delete Collection"; +"collections.delete_with_items" = "Delete Collection and Items"; +"collections.create_title" = "Create Collection"; +"collections.picker_title" = "Choose Parent"; +"collections.empty_trash" = "Empty Trash"; +"collections.collapse_all" = "Collapse All"; +"collections.expand_all" = "Expand All"; +"collections.create_bibliography" = "Create Bibliography from Collection"; +"collections.download_attachments" = "Download Attachments"; +"collections.delete_attachment_files" = "Remove Downloads"; + +"sync_toolbar.starting" = "Sync starting"; +"sync_toolbar.groups" = "Syncing groups"; +"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; +"sync_toolbar.library" = "Syncing %@"; +"sync_toolbar.object" = "Syncing %@ in %@"; +"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Finished sync"; +"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.aborted" = "Sync failed (%@)"; +"sync_toolbar.writes" = "Uploading changes (%d / %d)"; +"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.object.collections" = "collections"; +"sync_toolbar.object.groups" = "groups"; +"sync_toolbar.object.items" = "items"; +"sync_toolbar.object.searches" = "searches"; + +"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; + +"items.search_title" = "Search Items"; +"items.select_all" = "Select All"; +"items.deselect_all" = "Deselect All"; +"items.sort_by" = "Sort By"; +"items.sort_order" = "Sort Order"; +"items.ascending" = "Ascending"; +"items.descending" = "Descending"; +"items.lookup" = "Add by Identifier"; +"items.barcode" = "Scan Barcode"; +"items.new" = "Add Manually"; +"items.new_note" = "New Standalone Note"; +"items.new_file" = "Add File"; +"items.remove_from_collection_title" = "Remove from Collection"; +"items.action.add_to_collection" = "Add to Collection"; +"items.action.remove_from_collection" = "Remove from Collection"; +"items.action.duplicate" = "Duplicate"; +"items.action.create_parent" = "Create Parent Item"; +"items.action.download" = "Download"; +"items.action.remove_download" = "Remove Download"; +"items.action.retrieve_metadata" = "Retrieve Metadata"; +"items.filters.title" = "Filters"; +"items.filters.downloads" = "Downloaded Files"; +"items.filters.tags" = "Tags"; +"items.toolbar_saved" = "Saved %d / %d"; +"items.toolbar_downloaded" = "Downloaded %d / %d"; +"items.generating_bib" = "Generating Bibliography"; +"items.creator_summary.and" = "%@ and %@"; +"items.creator_summary.etal" = "%@ et al."; +"items.retrieving_metadata" = "Retrieving Metadata"; + +"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; + +"citation.title" = "Citation Preview"; +"citation.copy_citation" = "Copy Citation"; +"citation.copy_bibliography" = "Copy Bibliography"; +"citation.preview" = "Preview"; +"citation.omit_author" = "Omit Author"; +"citation.locator_placeholder" = "Number"; +"citation.locator.page" = "Page"; +"citation.locator.book" = "Book"; +"citation.locator.chapter" = "Chapter"; +"citation.locator.column" = "Column"; +"citation.locator.figure" = "Figure"; +"citation.locator.folio" = "Folio"; +"citation.locator.issue" = "Issue"; +"citation.locator.line" = "Line"; +"citation.locator.note" = "Note"; +"citation.locator.opus" = "Opus"; +"citation.locator.paragraph" = "Paragraph"; +"citation.locator.part" = "Part"; +"citation.locator.section" = "Section"; +"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.volume" = "Volume"; +"citation.locator.verse" = "Verse"; +"citation.style" = "Style"; +"citation.language" = "Language"; +"citation.output_mode" = "Output Mode"; +"citation.citations" = "Citations"; +"citation.bibliography" = "Bibliography"; +"citation.notes" = "Notes"; +"citation.output_method" = "Output Method"; +"citation.save_html" = "Save as HTML"; +"citation.copy" = "Copy to Clipboard"; + +"item_detail.add_creator" = "Add Creator"; +"item_detail.notes" = "Notes"; +"item_detail.add_note" = "Add note"; +"item_detail.tags" = "Tags"; +"item_detail.add_tag" = "Add tag"; +"item_detail.attachments" = "Attachments"; +"item_detail.add_attachment" = "Add attachment"; +"item_detail.split_name" = "Split name"; +"item_detail.merge_name" = "Merge name"; +"item_detail.untitled" = "Title"; +"item_detail.show_more" = "Show more"; +"item_detail.show_less" = "Show less"; +"item_detail.view_pdf" = "View PDF"; +"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; +"item_detail.delete_attachment_file" = "Remove Download"; +"item_detail.deleted_title" = "Deleted"; +"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; +"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; + +"tag_picker.title" = "%d selected"; +"tag_picker.placeholder" = "Tag name"; +"tag_picker.create_tag" = "Create Tag “%@”"; +"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; +"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.deselect_all" = "Deselect All"; +"tag_picker.show_auto" = "Show Automatic Tags"; +"tag_picker.show_all" = "Display All Tags in This Library"; +"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; + +"creator_editor.creator" = "Creator Type"; +"creator_editor.first_name" = "First Name"; +"creator_editor.last_name" = "Last Name"; +"creator_editor.switch_to_single" = "Switch to single field"; +"creator_editor.switch_to_dual" = "Switch to two fields"; +"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; + +"pdf.annotations_sidebar.search_title" = "Search"; +"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_tags" = "Add tags"; +"pdf.annotations_sidebar.merge" = "Merge"; +"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; +"pdf.search.title" = "Search in Document"; +"pdf.search.failed" = "Search failed"; +"pdf.search.dismiss" = "Dismiss Search"; +"pdf.annotation_popover.title" = "Edit Annotation"; +"pdf.annotation_popover.delete" = "Delete Annotation"; +"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; +"pdf.annotation_popover.page_label_title" = "Edit Page Number"; +"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.line_width" = "Width"; +"pdf.annotation_popover.size" = "Size"; +"pdf.deleted_title" = "Deleted"; +"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.line_width_point" = "%0.1f pt"; +"pdf.highlight" = "Highlight"; +"pdf.underline" = "Underline"; +"pdf.annotation_share.image.share" = "Share image"; +"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.large" = "Large"; +"pdf.annotation_toolbar.eraser" = "Eraser"; +"pdf.annotation_toolbar.highlight" = "Highlight"; +"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.image" = "Image"; +"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.underline" = "Underline"; +"pdf.annotation_toolbar.text" = "Text"; +"pdf.locked.locked" = "Locked"; +"pdf.locked.enter_password" = "Please enter the password to open this PDF."; +"pdf.locked.failed" = "Incorrect password. Please try again."; +"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.settings.scroll_direction.horizontal" = "Horizontal"; +"pdf.settings.scroll_direction.vertical" = "Vertical"; +"pdf.settings.page_transition.title" = "Page Transition"; +"pdf.settings.page_transition.jump" = "Jump"; +"pdf.settings.page_transition.continuous" = "Continuous"; +"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.auto" = "Automatic"; +"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.dark_mode" = "Dark"; +"pdf.settings.appearance.sepia_mode" = "Sepia"; +"pdf.settings.page_mode.title" = "Page Mode"; +"pdf.settings.page_mode.single" = "Single"; +"pdf.settings.page_mode.double" = "Double"; +"pdf.settings.page_mode.automatic" = "Automatic"; +"pdf.settings.page_fitting.title" = "Page Fitting"; +"pdf.settings.page_fitting.fit" = "Fit"; +"pdf.settings.page_fitting.fill" = "Fill"; +"pdf.settings.page_spreads.title" = "Page Spreads"; +"pdf.settings.page_spreads.odd" = "Odd"; +"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_fitting.automatic" = "Automatic"; +"pdf.export.export" = "Export PDF"; +"pdf.export.export_annotated" = "Export Annotated PDF"; +"pdf.sidebar.no_annotations" = "No Annotations"; +"pdf.sidebar.no_outline" = "No Outline"; +"pdf.delete_annotation" = "Do you really want to delete this annotation?"; +"pdf.previous_page" = "Previous Page"; +"pdf.next_page" = "Next Page"; +"pdf.previous_viewport" = "Previous Viewport"; +"pdf.next_viewport" = "Next Viewport"; + +"settings.title" = "Settings"; +"settings.logout" = "Sign Out"; +"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.general.title" = "General"; +"settings.general.show_subcollections_title" = "Show Items from Subcollections"; +"settings.general.show_collection_item_counts" = "Show Collection Sizes"; +"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; +"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.never" = "Never"; +"settings.item_count" = "Item count"; +"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.sync.title" = "Account"; +"settings.sync.data_syncing" = "Data Syncing"; +"settings.sync.file_syncing" = "File Syncing"; +"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.account" = "Account"; +"settings.sync.manage_account" = "Manage Account"; +"settings.sync.delete_account" = "Delete Account"; +"settings.sync.username" = "Username"; +"settings.sync.password" = "Password"; +"settings.sync.verify" = "Verify Server"; +"settings.sync.directory_not_found.title" = "Directory not found"; +"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.verified" = "Verified"; +"settings.permission" = "User Permission"; +"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.translators" = "Translators"; +"settings.translators_update" = "Update translators"; +"settings.translators_updating" = "Updating…"; +"settings.reset_to_bundled" = "Reset to bundled"; +"settings.debug" = "Debug Output Logging"; +"settings.logging_title" = "Logging"; +"settings.start_logging" = "Start Logging"; +"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; +"settings.cancel_logging" = "Cancel Logging"; +"settings.stop_logging" = "Stop Logging"; +"settings.view_output" = "View Output"; +"settings.clear_output" = "Clear Output"; +"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; +"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.send_manually" = "Send Manually"; +"settings.log_alert.progress_title" = "Sending Logs"; +"settings.log_alert.title" = "Logs Sent"; +"settings.log_alert.message" = "Your Debug ID is %@"; +"settings.crash_alert.title" = "Crash Log Sent"; +"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; +"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; +"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; +"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.crash_alert.copy" = "Copy to Clipboard"; +"settings.websocket_title" = "Server Connection"; +"settings.websocket_connected" = "Connected"; +"settings.websocket_connecting" = "Connecting"; +"settings.websocket_disconnected" = "Disconnected"; +"settings.websocket_disconnect" = "Disconnect from Server"; +"settings.websocket_connect" = "Connect to Server"; +"settings.storage" = "Local Storage"; +"settings.storage.delete_all" = "Delete All Local Attachment Files"; +"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; +"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; +"settings.saving.title" = "Saving"; +"settings.saving.files_title" = "Save Files"; +"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; +"settings.saving.tags_title" = "Save Automatic Tags"; +"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; +"settings.cite.title" = "Cite"; +"settings.cite.styles_title" = "Citation Styles"; +"settings.cite.get_more_styles" = "Get additional styles"; +"settings.cite_search.search_title" = "Search styles"; +"settings.export.title" = "Quick Copy"; +"settings.export.default_format" = "Default Format"; +"settings.export.language" = "Language"; +"settings.export.copy_as_html" = "Copy as HTML"; +"settings.versionAndBuild" = "Version %@ Build %@"; +"settings.export_db" = "Export Database File"; +"settings.full_sync_debug" = "Advanced"; +"settings.full_sync.start" = "Start Full Sync Debugging"; +"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; +"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.annotation_tools" = "Annotation Tools"; +"settings.annotation_tools.pdf" = "PDF"; +"settings.annotation_tools.html_epub" = "HTML / EPUB"; +"settings.annotation_tools.reset" = "Reset"; + +"shareext.save" = "Save to Zotero"; +"shareext.decoding_attachment" = "Searching for items"; +"shareext.translation.item_selection" = "Choose an item"; +"shareext.translation.translating_with" = "Saving with %@"; +"shareext.loading_collections" = "Loading Collections"; +"shareext.sync_error" = "Unable to sync collections"; +"shareext.collection_other" = "More"; +"shareext.item_title" = "Item"; +"shareext.collection_title" = "Collection"; +"shareext.tags_title" = "Tags"; + +"searchbar.placeholder" = "Search"; +"searchbar.accessibility_cancel" = "Cancel Search"; +"searchbar.accessibility_clear" = "Clear Search"; + +"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; +"errors.parsing" = "Could not parse some data. Other data will continue to sync."; +"errors.api" = "Failed API response: %@"; +"errors.db" = "Could not connect to database. The device storage might be full."; +"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.unknown" = "Unknown error"; +"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; +"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; +"errors.attachments.cant_open_attachment" = "The attached file could not be found."; +"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; +"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; +"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; +"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; +"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; +"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; +"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.generic_filename" = "the file"; +"errors.login.invalid_password" = "Invalid password"; +"errors.login.invalid_username" = "Invalid username"; +"errors.login.invalid_credentials" = "Invalid username or password"; +"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.collections.empty_name" = "Please enter a collection name"; +"errors.collections.save_failed" = "Unable to save collection"; +"errors.collections.bibliography_failed" = "Could not load items for bibliography"; +"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; +"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.revert_to_original" = "Revert to original"; +"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; +"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.skip_group" = "Skip Group"; +"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; +"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; +"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; +"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; +"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; +"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; +"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; +"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; +"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; +"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.show_item" = "Show Item"; +"errors.sync_toolbar.show_items" = "Show Items"; +"errors.sync_toolbar.forbidden" = "Invalid username or password"; +"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; +"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; +"errors.items.loading" = "Could not load items"; +"errors.items.deletion" = "Could not remove item"; +"errors.items.deletion_from_collection" = "Could not remove item from collection"; +"errors.items.add_to_collection" = "Could not add item to collection"; +"errors.items.move_item" = "Could not move item"; +"errors.items.save_note" = "Could not save note"; +"errors.items.add_attachment" = "Could not add attachment"; +"errors.items.add_some_attachments" = "Some attachments were not added: %@"; +"errors.items.load_duplication" = "Could not load item to duplicate"; +"errors.items.generating_bib" = "Could not generate bibliography"; +"errors.citation_preview" = "Could not generate citation preview"; +"errors.item_detail.dropped_fields_title" = "Change Item Type"; +"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; +"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; +"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.item_detail.cant_create_attachments" = "Could not create attachments"; +"errors.item_detail.cant_save_note" = "Could not save note"; +"errors.item_detail.cant_save_changes" = "Could not save changes"; +"errors.item_detail.cant_trash_item" = "Could not move item to trash"; +"errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; +"errors.settings.storage" = "Could not collect storage data"; +"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.invalid_url" = "WebDAV verification error"; +"errors.settings.webdav.no_password" = "WebDAV verification error"; +"errors.settings.webdav.no_url" = "WebDAV verification error"; +"errors.settings.webdav.no_username" = "WebDAV verification error"; +"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; +"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; +"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; +"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; +"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; +"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; +"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; +"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; +"errors.shareext.logged_out" = "Please log into the app before using this extension."; +"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; +"errors.shareext.unknown" = "An unknown error occurred."; +"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; +"errors.shareext.download_failed" = "Could not download file"; +"errors.shareext.items_not_found" = "No items found on page"; +"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.shareext.translation_failed" = "Saving failed"; +"errors.shareext.response_missing_data" = "An error occurred. Please try again."; +"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; +"errors.shareext.file_not_pdf" = "Unable to save PDF"; +"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; +"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; +"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; +"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; +"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.webdav_not_verified" = "WebDAV verification error"; +"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; +"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.logging.title" = "Debugging Error"; +"errors.logging.start" = "Unable to start debug logging"; +"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; +"errors.logging.upload" = "Could not upload logs. Please try again."; +"errors.logging.response_parsing" = "Unexpected response from server"; +"errors.translators.bundle_loading" = "Could not update translators. Try again?"; +"errors.styles.addition" = "Could not add style “%@”"; +"errors.styles.deletion" = "Could not delete style “%@”"; +"errors.styles.loading" = "Could not load styles"; +"errors.styles_search.loading" = "Could not load styles. Try again?"; +"errors.citation.generate_citation" = "Could not generate citation"; +"errors.citation.generate_bibliography" = "Could not generate bibliography"; +"errors.citation.invalid_types" = "Invalid item types selected"; +"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.citation.open_settings" = "Open Settings"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; +"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; +"errors.pdf.merge_too_big" = "The combined annotation would be too large."; +"errors.pdf.cant_update_annotation" = "Can’t update annotation"; +"errors.pdf.cant_add_annotations" = "Can’t add annotations"; +"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; +"errors.pdf.incompatible_document" = "This document is not supported."; +"errors.pdf.empty_document" = "This document is empty."; +"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; +"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; + +"accessibility.untitled" = "Title"; +"accessibility.locked" = "Locked"; +"accessibility.archived" = "Archived"; +"accessibility.collections.items" = "items"; +"accessibility.collections.expand" = "Expand"; +"accessibility.collections.collapse" = "Collapse"; +"accessibility.collections.create_collection" = "Create collection"; +"accessibility.collections.search_collections" = "Search collections"; +"accessibility.collections.expand_all_collections" = "Expand all collections"; +"accessibility.items.open_item" = "Open item info"; +"accessibility.items.select_items" = "Select items"; +"accessibility.items.select_all_items" = "Select All Items"; +"accessibility.items.deselect_all_items" = "Deselect All Items"; +"accessibility.items.filter_items" = "Filter items"; +"accessibility.items.sort_items" = "Sort items"; +"accessibility.items.add_to_collection" = "Add selected items to collection"; +"accessibility.items.remove_from_collection" = "Remove selected items from collection"; +"accessibility.items.trash" = "Move selected items to trash"; +"accessibility.items.delete" = "Delete selected items"; +"accessibility.items.restore" = "Restore selected items"; +"accessibility.items.duplicate" = "Duplicate selected item"; +"accessibility.items.share" = "Share selected items"; +"accessibility.items.download_attachments" = "Download attachments for selected items"; +"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.collection" = "Collection"; +"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; +"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.pdf.sidebar_open" = "Open sidebar"; +"accessibility.pdf.sidebar_close" = "Close sidebar"; +"accessibility.pdf.share" = "Share PDF"; +"accessibility.pdf.export" = "Export PDF"; +"accessibility.pdf.export_annotated" = "Export annotated PDF"; +"accessibility.pdf.settings" = "Settings"; +"accessibility.pdf.color_picker" = "Color picker"; +"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; +"accessibility.pdf.note_annotation_tool" = "Create note annotation"; +"accessibility.pdf.image_annotation_tool" = "Create image annotation"; +"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; +"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; +"accessibility.pdf.text_annotation_tool" = "Create text annotation"; +"accessibility.pdf.eraser_annotation_tool" = "Eraser"; +"accessibility.pdf.highlight_annotation" = "Highlight annotation"; +"accessibility.pdf.note_annotation" = "Note annotation"; +"accessibility.pdf.image_annotation" = "Image annotation"; +"accessibility.pdf.ink_annotation" = "Ink annotation"; +"accessibility.pdf.underline_annotation" = "Underline annotation"; +"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.edit_annotation" = "Edit annotation"; +"accessibility.pdf.share_annotation" = "Share annotation"; +"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.eraser_annotation" = "Eraser"; +"accessibility.pdf.highlighted_text" = "Highlighted text"; +"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.author" = "Author"; +"accessibility.pdf.comment" = "Comment"; +"accessibility.pdf.tags" = "Tags"; +"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; +"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.selected" = "Selected"; +"accessibility.pdf.search_pdf" = "Search PDF"; +"accessibility.pdf.redo" = "Redo"; +"accessibility.pdf.undo" = "Undo"; +"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; +"accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.htmlepub.search_html" = "Search Website"; +"accessibility.htmlepub.search_epub" = "Search EPUB"; +"accessibility.speech.play" = "Start speaking"; +"accessibility.speech.pause" = "Pause speaking"; +"accessibility.speech.forward" = "Skip forward"; +"accessibility.speech.backward" = "Skip backward"; +"accessibility.speech.title" = "Read Aloud"; +"accessibility.show_reader" = "Reading Mode"; +"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; +"accessibility.show_speech" = "Read Aloud"; +"accessibility.show_speech_accessibility_label" = "Start reading aloud"; +"accessibility.open_document_accessibility" = "Open accessibility options"; diff --git a/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict b/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict new file mode 100644 index 000000000..eb2a525b7 --- /dev/null +++ b/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict @@ -0,0 +1,70 @@ + + + + items.collections_selected + + NSStringLocalizedFormatKey + %#@collections_selected@ + + items.delete_question + + NSStringLocalizedFormatKey + %#@delete_question@ + + items.remove_from_collection_question + + NSStringLocalizedFormatKey + %#@remove_from_collection_question@ + + items.toolbar_filter + + NSStringLocalizedFormatKey + %#@toolbar_filter@ + + pdf.search.matches + + NSStringLocalizedFormatKey + %#@matches@ + + settings.storage.files_size_and_unit + + NSStringLocalizedFormatKey + %#@files@ + + errors.sync_toolbar.errors + + NSStringLocalizedFormatKey + %#@errors@ + + tag_picker.tags_selected + + NSStringLocalizedFormatKey + %#@tags_selected@ + + tag_picker.confirm_deletion + + NSStringLocalizedFormatKey + %#@confirm_deletion@ + + settings.lines_logged + + NSStringLocalizedFormatKey + %#@lines_logged@ + + settings.lines + + NSStringLocalizedFormatKey + %#@lines@ + + errors.sync_toolbar.webdav_error2 + + NSStringLocalizedFormatKey + %#@webdav_error2@ + + settings.general.after_x_days + + NSStringLocalizedFormatKey + %#@after_x_days@ + + + From 850237da13a16307505f163cc755477aae4652af Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 8 Jan 2026 13:00:04 +0200 Subject: [PATCH 54/75] Guard when migrating from an old schema without the "changes" property (#1228) --- Zotero/Models/Database/Database.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zotero/Models/Database/Database.swift b/Zotero/Models/Database/Database.swift index 9416879ac..60b0e9524 100644 --- a/Zotero/Models/Database/Database.swift +++ b/Zotero/Models/Database/Database.swift @@ -150,7 +150,7 @@ struct Database { let itemChange = RItemChanges.fields let newChanges = List() newChanges.append(RObjectChange.create(changes: itemChange)) - if let oldChanges = oldObject["changes"] as? List { + if oldObject.objectSchema.properties.contains(where: { $0.name == "changes" }), let oldChanges = oldObject["changes"] as? List { for oldChange in oldChanges { if let oldIdentifier = oldChange["identifier"] as? String, let oldRawChanges = oldChange["rawChanges"] as? Int16, oldRawChanges != itemChange.rawValue { let existingChange = RObjectChange() @@ -212,7 +212,7 @@ struct Database { let itemChange = RItemChanges.fields let newChanges = List() newChanges.append(RObjectChange.create(changes: itemChange)) - if let oldChanges = oldObject["changes"] as? List { + if oldObject.objectSchema.properties.contains(where: { $0.name == "changes" }), let oldChanges = oldObject["changes"] as? List { for oldChange in oldChanges { if let oldIdentifier = oldChange["identifier"] as? String, let oldRawChanges = oldChange["rawChanges"] as? Int16, oldRawChanges != itemChange.rawValue { let existingChange = RObjectChange() From 0d47cc4ff6cada87829be4c4c4e50ff27ea36597 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 9 Jan 2026 16:24:33 +0200 Subject: [PATCH 55/75] Fix swiftlint violations --- ZShare/View Controllers/ShareViewController.swift | 1 + ZShare/ViewModels/ExtensionViewModel.swift | 3 +++ Zotero/Controllers/API/Alamofire+RxSwift.swift | 2 ++ .../Database/Requests/CreateAttachmentDbRequest.swift | 2 ++ .../Database/Requests/MarkObjectsAsChangedByUser.swift | 1 + .../Requests/SetCollectionCollapsedDbRequest.swift | 2 ++ .../Database/Requests/StoreItemsDbResponseRequest.swift | 1 + .../Debugging/DebugResponseParserDelegate.swift | 1 + Zotero/Controllers/ObjectUserChangeObserver.swift | 4 ++++ Zotero/Controllers/RepoParserDelegate.swift | 1 + Zotero/Controllers/StyleParserDelegate.swift | 2 ++ .../Sync/SyncActions/SubmitDeletionSyncAction.swift | 1 + .../Sync/SyncActions/SubmitUpdateSyncAction.swift | 4 ++++ .../Sync/SyncActions/SyncVersionsSyncAction.swift | 1 + Zotero/Controllers/Sync/SyncController.swift | 8 ++++++++ Zotero/Controllers/WebSocketController.swift | 2 ++ Zotero/Extensions/Error+Helpers.swift | 1 + Zotero/Models/CollectionIdentifier.swift | 1 + Zotero/Models/DeletableObject.swift | 1 + Zotero/Models/Predicates.swift | 3 +++ .../Views/CitationBibliographyExportView.swift | 1 + .../Views/ItemDetailCollectionViewHandler.swift | 1 + .../Detail/Lookup/Views/ScannerViewController.swift | 1 + .../ViewModels/CollectionsPickerActionHandler.swift | 1 + .../Libraries/ViewModels/LibrariesActionHandler.swift | 1 + ZoteroTests/SyncControllerSpec.swift | 4 ++++ ZoteroTests/WebDavControllerSpec.swift | 2 ++ 27 files changed, 53 insertions(+) diff --git a/ZShare/View Controllers/ShareViewController.swift b/ZShare/View Controllers/ShareViewController.swift index d34b8efdb..46537166b 100644 --- a/ZShare/View Controllers/ShareViewController.swift +++ b/ZShare/View Controllers/ShareViewController.swift @@ -503,6 +503,7 @@ final class ShareViewController: UIViewController { case .noSuccessfulTranslators: return nil + case .cantFindFile, .webExtractionMissingJs: // should never happen return L10n.Errors.Shareext.missingBaseFiles diff --git a/ZShare/ViewModels/ExtensionViewModel.swift b/ZShare/ViewModels/ExtensionViewModel.swift index 4358defb6..31375fe2d 100644 --- a/ZShare/ViewModels/ExtensionViewModel.swift +++ b/ZShare/ViewModels/ExtensionViewModel.swift @@ -164,6 +164,7 @@ final class ExtensionViewModel { default: return true } + default: return false } } @@ -427,6 +428,7 @@ final class ExtensionViewModel { case .itemWithAttachment(_, _, let file), .file(let file, _): // Remove temporary local file if it exists try? self.fileStorage.remove(file) + case .item: break } } @@ -1023,6 +1025,7 @@ final class ExtensionViewModel { switch self.state.attachmentState { case .downloading: self.state.attachmentState = .downloading(progress.fractionCompleted) + default: break } }) diff --git a/Zotero/Controllers/API/Alamofire+RxSwift.swift b/Zotero/Controllers/API/Alamofire+RxSwift.swift index b8ed19aaf..161fa4ad1 100644 --- a/Zotero/Controllers/API/Alamofire+RxSwift.swift +++ b/Zotero/Controllers/API/Alamofire+RxSwift.swift @@ -57,8 +57,10 @@ extension ObservableType where Element == (Data?, HTTPURLResponse) { return .progressive() } return nil + default: return nil } + default: return nil } }) diff --git a/Zotero/Controllers/Database/Requests/CreateAttachmentDbRequest.swift b/Zotero/Controllers/Database/Requests/CreateAttachmentDbRequest.swift index 8c34da5f4..fab7fd030 100644 --- a/Zotero/Controllers/Database/Requests/CreateAttachmentDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/CreateAttachmentDbRequest.swift @@ -98,6 +98,7 @@ struct CreateAttachmentDbRequest: DbResponseRequest { switch self.attachment.type { case .file(_, let contentType, _, _, _): value = contentType + case .url: continue } @@ -118,6 +119,7 @@ struct CreateAttachmentDbRequest: DbResponseRequest { case .file: let modificationTime = Int(round(Date().timeIntervalSince1970 * 1000)) value = "\(modificationTime)" + case .url: continue } diff --git a/Zotero/Controllers/Database/Requests/MarkObjectsAsChangedByUser.swift b/Zotero/Controllers/Database/Requests/MarkObjectsAsChangedByUser.swift index d095494d6..93619b8df 100644 --- a/Zotero/Controllers/Database/Requests/MarkObjectsAsChangedByUser.swift +++ b/Zotero/Controllers/Database/Requests/MarkObjectsAsChangedByUser.swift @@ -65,6 +65,7 @@ struct MarkOtherObjectsAsChangedByUser: DbRequest { case .trash: let objects = database.objects(RItem.self).filter(.library(with: self.libraryId)).filter(.syncState(.synced)).filter(.isTrash(true)) self.markAsChanged(notIn: self.versions, objects: objects, database: database) + case .settings: break } } diff --git a/Zotero/Controllers/Database/Requests/SetCollectionCollapsedDbRequest.swift b/Zotero/Controllers/Database/Requests/SetCollectionCollapsedDbRequest.swift index 78503cf7b..7cd669a5a 100644 --- a/Zotero/Controllers/Database/Requests/SetCollectionCollapsedDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/SetCollectionCollapsedDbRequest.swift @@ -22,6 +22,7 @@ struct SetCollectionCollapsedDbRequest: DbRequest { case .collection(let key): guard let collection = database.objects(RCollection.self).uniqueObject(key: key, libraryId: libraryId), collection.collapsed != self.collapsed else { return } collection.collapsed = self.collapsed + case .search: break // TODO case .custom: break } @@ -44,6 +45,7 @@ struct SetCollectionsCollapsedDbRequest: DbRequest { for collection in database.objects(RCollection.self).filter(.keys(keys, in: self.libraryId)) { collection.collapsed = self.collapsed } + case .search: break // TODO case .custom: break } diff --git a/Zotero/Controllers/Database/Requests/StoreItemsDbResponseRequest.swift b/Zotero/Controllers/Database/Requests/StoreItemsDbResponseRequest.swift index 83a63b34c..be2858126 100644 --- a/Zotero/Controllers/Database/Requests/StoreItemsDbResponseRequest.swift +++ b/Zotero/Controllers/Database/Requests/StoreItemsDbResponseRequest.swift @@ -248,6 +248,7 @@ struct StoreItemDbRequest: DbResponseRequest { case (FieldKeys.Item.Attachment.contentType, _), (_, FieldKeys.Item.Attachment.contentType): contentType = value + default: break } } diff --git a/Zotero/Controllers/Debugging/DebugResponseParserDelegate.swift b/Zotero/Controllers/Debugging/DebugResponseParserDelegate.swift index 60751dc2f..361f47eef 100644 --- a/Zotero/Controllers/Debugging/DebugResponseParserDelegate.swift +++ b/Zotero/Controllers/Debugging/DebugResponseParserDelegate.swift @@ -21,6 +21,7 @@ final class DebugResponseParserDelegate: NSObject, XMLParserDelegate { case "reported": guard let reportId = attributeDict["reportID"] else { return } self.reportId = reportId + default: break } } diff --git a/Zotero/Controllers/ObjectUserChangeObserver.swift b/Zotero/Controllers/ObjectUserChangeObserver.swift index 8296cbbeb..5cca98592 100644 --- a/Zotero/Controllers/ObjectUserChangeObserver.swift +++ b/Zotero/Controllers/ObjectUserChangeObserver.swift @@ -52,7 +52,9 @@ final class RealmObjectUserChangeObserver: ObjectUserChangeObserver { guard !insertions.isEmpty || !modifications.isEmpty else { return } // Settings are always reported by user library, even if they belong to groups. self?.observable.on(.next([.custom(.myLibrary)])) + case .initial: break // ignore the initial change, initially a full sync is performed anyway + case .error(let error): DDLogError("RealmObjectChangeObserver: RPageIndex observing error - \(error)") } @@ -67,7 +69,9 @@ final class RealmObjectUserChangeObserver: ObjectUserChangeObserver { let correctedModifications = Database.correctedModifications(from: modifications, insertions: insertions, deletions: deletions) let updated = (insertions + correctedModifications).map({ results[$0] }) self?.reportChangedLibraries(for: updated) + case .initial: break // ignore the initial change, initially a full sync is performed anyway + case .error(let error): DDLogError("RealmObjectChangeObserver: \(Obj.self) observing error - \(error)") } diff --git a/Zotero/Controllers/RepoParserDelegate.swift b/Zotero/Controllers/RepoParserDelegate.swift index 51455f359..3ab663b26 100644 --- a/Zotero/Controllers/RepoParserDelegate.swift +++ b/Zotero/Controllers/RepoParserDelegate.swift @@ -53,6 +53,7 @@ final class RepoParserDelegate: NSObject, XMLParserDelegate { case .style: self.currentStyleId = attributeDict["id"] + default: break } } diff --git a/Zotero/Controllers/StyleParserDelegate.swift b/Zotero/Controllers/StyleParserDelegate.swift index 2f38c57f5..dad2c5434 100644 --- a/Zotero/Controllers/StyleParserDelegate.swift +++ b/Zotero/Controllers/StyleParserDelegate.swift @@ -58,6 +58,7 @@ final class StyleParserDelegate: NSObject, XMLParserDelegate { case "independent-parent": self.dependencyHref = attributeDict["href"] + default: break } } @@ -97,6 +98,7 @@ final class StyleParserDelegate: NSObject, XMLParserDelegate { case .bibliography: self.supportsBibliography = true + case .link, .style: break } diff --git a/Zotero/Controllers/Sync/SyncActions/SubmitDeletionSyncAction.swift b/Zotero/Controllers/Sync/SyncActions/SubmitDeletionSyncAction.swift index 6c5f05000..fc211ccfb 100644 --- a/Zotero/Controllers/Sync/SyncActions/SubmitDeletionSyncAction.swift +++ b/Zotero/Controllers/Sync/SyncActions/SubmitDeletionSyncAction.swift @@ -60,6 +60,7 @@ struct SubmitDeletionSyncAction: SyncAction { case .search: requests.insert(DeleteObjectsDbRequest(keys: self.keys, libraryId: self.libraryId), at: 0) + case .settings: break } diff --git a/Zotero/Controllers/Sync/SyncActions/SubmitUpdateSyncAction.swift b/Zotero/Controllers/Sync/SyncActions/SubmitUpdateSyncAction.swift index 4271544bb..5346057e9 100644 --- a/Zotero/Controllers/Sync/SyncActions/SubmitUpdateSyncAction.swift +++ b/Zotero/Controllers/Sync/SyncActions/SubmitUpdateSyncAction.swift @@ -101,6 +101,7 @@ struct SubmitUpdateSyncAction: SyncAction { case .item, .trash: // Cache JSONs locally for later use (in CR) self.storeIndividualItemJsonObjects(from: Array(response.successfulJsonObjects.values), libraryId: self.libraryId) + case .collection, .search, .settings: break } } @@ -180,6 +181,7 @@ struct SubmitUpdateSyncAction: SyncAction { case .search: let response = try SearchResponse(response: json) changedSearches.append(response) + case .settings: break } } catch let error { @@ -210,6 +212,7 @@ struct SubmitUpdateSyncAction: SyncAction { case .search: requests.append(MarkObjectsAsSyncedDbRequest(libraryId: self.libraryId, keys: unchangedKeys, changeUuids: self.changeUuids, version: version)) + case .settings: break } } @@ -225,6 +228,7 @@ struct SubmitUpdateSyncAction: SyncAction { case .search: requests.append(MarkForResyncDbAction(libraryId: self.libraryId, keys: unchangedKeys)) + case .settings: break } } diff --git a/Zotero/Controllers/Sync/SyncActions/SyncVersionsSyncAction.swift b/Zotero/Controllers/Sync/SyncActions/SyncVersionsSyncAction.swift index efab87d3c..0da228829 100644 --- a/Zotero/Controllers/Sync/SyncActions/SyncVersionsSyncAction.swift +++ b/Zotero/Controllers/Sync/SyncActions/SyncVersionsSyncAction.swift @@ -87,6 +87,7 @@ struct SyncVersionsSyncAction: SyncAction { switch syncType { case .full: try coordinator.perform(request: MarkOtherObjectsAsChangedByUser(syncObject: object, versions: response, libraryId: libraryId)) + case .collectionsOnly, .ignoreIndividualDelays, .normal, .keysOnly, .prioritizeDownloads: break } diff --git a/Zotero/Controllers/Sync/SyncController.swift b/Zotero/Controllers/Sync/SyncController.swift index 3e27d5f06..418979637 100644 --- a/Zotero/Controllers/Sync/SyncController.swift +++ b/Zotero/Controllers/Sync/SyncController.swift @@ -1061,6 +1061,7 @@ final class SyncController: SynchronizationController { if updateIds.contains(groupId) { idsToSync.append(groupId) } + case .custom: break } } @@ -1963,6 +1964,7 @@ final class SyncController: SynchronizationController { case .submitDeleteBatch(let batch): let updatedBatch = batch.copy(withVersion: version) self.queue[0] = .submitDeleteBatch(updatedBatch) + default: break } } @@ -1981,6 +1983,7 @@ final class SyncController: SynchronizationController { guard actionLibraryId == libraryId else { continue } self.queue[idx] = .storeDeletionVersion(libraryId: libraryId, version: version) return + default: continue } } @@ -2114,6 +2117,7 @@ final class SyncController: SynchronizationController { } else { return .fatal(.apiError(response: error.localizedDescription, data: data)) } + case .multipartEncodingFailed, .parameterEncodingFailed, .parameterEncoderFailed, @@ -2331,6 +2335,7 @@ fileprivate extension SyncController.Action { case .uploadAttachment(let upload): return upload.libraryId + case .resolveDeletedGroup(let groupId, _), .resolveGroupMetadataWritePermission(let groupId, _), .deleteGroup(let groupId), @@ -2338,6 +2343,7 @@ fileprivate extension SyncController.Action { .syncGroupToDb(let groupId), .resolveGroupFileWritePermission(let groupId, _): return .group(groupId) + case .syncVersions(let libraryId, _, _, _), .storeVersion(_, let libraryId, _), .syncDeletions(let libraryId, _), @@ -2360,6 +2366,7 @@ fileprivate extension SyncController.Action { switch self { case .resolveDeletedGroup, .resolveGroupMetadataWritePermission, .syncDeletions, .resolveGroupFileWritePermission: return true + case .loadKeyPermissions, .createLibraryActions, .syncSettings, @@ -2391,6 +2398,7 @@ fileprivate extension SyncController.Action { switch self { case .submitDeleteBatch, .submitWriteBatch, .uploadAttachment: return true + case .loadKeyPermissions, .createLibraryActions, .syncSettings, diff --git a/Zotero/Controllers/WebSocketController.swift b/Zotero/Controllers/WebSocketController.swift index 8ee2da491..f9be185b8 100644 --- a/Zotero/Controllers/WebSocketController.swift +++ b/Zotero/Controllers/WebSocketController.swift @@ -117,6 +117,7 @@ final class WebSocketController { DDLogWarn("WebSocketController: tried to connect while \(self.connectionState.value)") completed?() return + case .connecting, .disconnected: break } @@ -230,6 +231,7 @@ final class WebSocketController { self.subscribe(apiKey: apiKey, completion: { [weak self] error in self?.processConnectionResponse(with: error, apiKey: apiKey) }) + case .connected: break } diff --git a/Zotero/Extensions/Error+Helpers.swift b/Zotero/Extensions/Error+Helpers.swift index 6de951994..952ba8081 100644 --- a/Zotero/Extensions/Error+Helpers.swift +++ b/Zotero/Extensions/Error+Helpers.swift @@ -36,6 +36,7 @@ extension AFError { case .sessionTaskFailed(let error): let nsError = error as NSError return nsError.domain == NSURLErrorDomain && nsError.code == NSURLErrorNotConnectedToInternet + case .multipartEncodingFailed, .parameterEncodingFailed, .parameterEncoderFailed, .invalidURL, .createURLRequestFailed, .requestAdaptationFailed, .requestRetryFailed, .serverTrustEvaluationFailed, .sessionDeinitialized, .sessionInvalidated, .urlRequestValidationFailed, .responseValidationFailed, .responseSerializationFailed, .createUploadableFailed, .downloadedFileMoveFailed, .explicitlyCancelled: diff --git a/Zotero/Models/CollectionIdentifier.swift b/Zotero/Models/CollectionIdentifier.swift index 5c9bbf1fc..107b7094c 100644 --- a/Zotero/Models/CollectionIdentifier.swift +++ b/Zotero/Models/CollectionIdentifier.swift @@ -51,6 +51,7 @@ extension CollectionIdentifier { case .trash: return true case .all, .publications, .unfiled: return false } + default: return false } } diff --git a/Zotero/Models/DeletableObject.swift b/Zotero/Models/DeletableObject.swift index 4cb9fd8a9..13d3694e2 100644 --- a/Zotero/Models/DeletableObject.swift +++ b/Zotero/Models/DeletableObject.swift @@ -80,6 +80,7 @@ extension RItem: Deletable { case ItemTypes.annotation: self.cleanupAnnotationFiles() + default: break } } diff --git a/Zotero/Models/Predicates.swift b/Zotero/Models/Predicates.swift index 703282637..ba356ae62 100644 --- a/Zotero/Models/Predicates.swift +++ b/Zotero/Models/Predicates.swift @@ -245,8 +245,10 @@ extension NSPredicate { switch type { case .unfiled: predicates.append(NSPredicate(format: "collections.@count == 0")) + case .all, .publications, .trash: break } + case .search: break } @@ -279,6 +281,7 @@ extension NSPredicate { let selfInCollection = NSPredicate(format: "any collections.key = %@", key) let parentInCollection = NSPredicate(format: "any parent.collections.key = %@", key) predicates.append(NSCompoundPredicate(orPredicateWithSubpredicates: [selfInCollection, parentInCollection])) + case .search, .custom: break } diff --git a/Zotero/Scenes/Detail/CitationBibliographyExport/Views/CitationBibliographyExportView.swift b/Zotero/Scenes/Detail/CitationBibliographyExport/Views/CitationBibliographyExportView.swift index 2d83d7981..1f2ba39b8 100644 --- a/Zotero/Scenes/Detail/CitationBibliographyExport/Views/CitationBibliographyExportView.swift +++ b/Zotero/Scenes/Detail/CitationBibliographyExport/Views/CitationBibliographyExportView.swift @@ -44,6 +44,7 @@ struct CitationBibliographyExportView: View { case .styleOrLocaleMissing: return nil + default: break } } diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift index 5f117ed82..47db98b88 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift @@ -309,6 +309,7 @@ final class ItemDetailCollectionViewHandler: NSObject { case .tags: view.setup(with: L10n.ItemDetail.tags) + default: break } } diff --git a/Zotero/Scenes/Detail/Lookup/Views/ScannerViewController.swift b/Zotero/Scenes/Detail/Lookup/Views/ScannerViewController.swift index 85a8e5012..df3a068ad 100644 --- a/Zotero/Scenes/Detail/Lookup/Views/ScannerViewController.swift +++ b/Zotero/Scenes/Detail/Lookup/Views/ScannerViewController.swift @@ -105,6 +105,7 @@ final class ScannerViewController: UIViewController { case .landscapeRight: self.previewLayer?.connection?.videoOrientation = .landscapeRight + case .unknown: break @unknown default: break } diff --git a/Zotero/Scenes/General/ViewModels/CollectionsPickerActionHandler.swift b/Zotero/Scenes/General/ViewModels/CollectionsPickerActionHandler.swift index 13e67f2ee..45843f9f1 100644 --- a/Zotero/Scenes/General/ViewModels/CollectionsPickerActionHandler.swift +++ b/Zotero/Scenes/General/ViewModels/CollectionsPickerActionHandler.swift @@ -64,6 +64,7 @@ struct CollectionsPickerActionHandler: ViewModelActionHandler { switch changes { case .update(let results, _, _, _): self.update(results: results, in: viewModel) + case .initial: break case .error: break } diff --git a/Zotero/Scenes/Master/Libraries/ViewModels/LibrariesActionHandler.swift b/Zotero/Scenes/Master/Libraries/ViewModels/LibrariesActionHandler.swift index 01697aacb..eb9cd6dff 100644 --- a/Zotero/Scenes/Master/Libraries/ViewModels/LibrariesActionHandler.swift +++ b/Zotero/Scenes/Master/Libraries/ViewModels/LibrariesActionHandler.swift @@ -69,6 +69,7 @@ struct LibrariesActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct state.changes.insert(.groupDeletion) } } + case .initial: break case .error: break } diff --git a/ZoteroTests/SyncControllerSpec.swift b/ZoteroTests/SyncControllerSpec.swift index e495f62f0..e92460c9b 100644 --- a/ZoteroTests/SyncControllerSpec.swift +++ b/ZoteroTests/SyncControllerSpec.swift @@ -98,6 +98,7 @@ final class SyncControllerSpec: QuickSpec { case .trash: versionResponses[object] = ["BBBBBBBB": 3] + case .settings: break } } @@ -293,6 +294,7 @@ final class SyncControllerSpec: QuickSpec { case .trash: versionResponses[object] = ["BBBBBBBB": 3] + case .settings: break } } @@ -939,6 +941,7 @@ final class SyncControllerSpec: QuickSpec { versionResponses[object] = ["DDDDDDDD": 1, "EEEEEEEE": 1, "FFFFFFFF": 1] + case .trash, .settings: break } } @@ -1001,6 +1004,7 @@ final class SyncControllerSpec: QuickSpec { "library": ["id": 0, "type": "user", "name": "A"] as [String: Any], "data": ["note": "This is a note", "itemType": "note", "tags": [] as [Any], "parentItem": "EEEEEEEE"] as [String: Any]]] + case .trash, .settings: break } } diff --git a/ZoteroTests/WebDavControllerSpec.swift b/ZoteroTests/WebDavControllerSpec.swift index 7fad23720..f8ccf8491 100644 --- a/ZoteroTests/WebDavControllerSpec.swift +++ b/ZoteroTests/WebDavControllerSpec.swift @@ -51,6 +51,7 @@ final class WebDavControllerSpec: QuickSpec { case .ready: successAction() + default: break } }) @@ -134,6 +135,7 @@ final class WebDavControllerSpec: QuickSpec { finished() return } + default: break } } From 2e441d7586e330389a47a7e5342c93b2aadca4a2 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Mon, 12 Jan 2026 13:20:41 -0500 Subject: [PATCH 56/75] Update locales from Transifex --- Zotero/Assets/ca.lproj/InfoPList.strings | 2 +- Zotero/Assets/ca.lproj/Localizable.strings | 22 +- .../en-GB.lproj/Localizable.stringsdict | 143 +++ Zotero/Assets/es-AR.lproj/Localizable.strings | 428 +++---- Zotero/Assets/es.lproj/Localizable.strings | 430 +++---- .../Assets/fi.lproj/Localizable.stringsdict | 66 + Zotero/Assets/fr.lproj/Localizable.strings | 66 +- Zotero/Assets/it.lproj/InfoPList.strings | 2 +- Zotero/Assets/it.lproj/Localizable.strings | 1104 ++++++++--------- 9 files changed, 1236 insertions(+), 1027 deletions(-) diff --git a/Zotero/Assets/ca.lproj/InfoPList.strings b/Zotero/Assets/ca.lproj/InfoPList.strings index 3b0b49013..96bfa867b 100644 --- a/Zotero/Assets/ca.lproj/InfoPList.strings +++ b/Zotero/Assets/ca.lproj/InfoPList.strings @@ -6,4 +6,4 @@ Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. */ -"my_library" = "My Library"; +"my_library" = "La meva biblioteca"; diff --git a/Zotero/Assets/ca.lproj/Localizable.strings b/Zotero/Assets/ca.lproj/Localizable.strings index f7bb399ae..ee58c6356 100644 --- a/Zotero/Assets/ca.lproj/Localizable.strings +++ b/Zotero/Assets/ca.lproj/Localizable.strings @@ -72,20 +72,20 @@ "onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; "onboarding.sign_in" = "Sign In"; "onboarding.create_account" = "Sign Up"; -"login.username" = "Username"; -"login.password" = "Password"; +"login.username" = "Nom d'usuari"; +"login.password" = "Contrasenya"; "login.email" = "Email"; "login.repeat_password" = "Repeat password"; "login.forgot_password" = "Forgot Password?"; -"libraries.my_library" = "My Library"; +"libraries.my_library" = "La meva biblioteca"; "libraries.group_libraries" = "Group Libraries"; "libraries.delete_question" = "Do you really want to delete “%@”?"; "collections.search_title" = "Find Collection"; "collections.all_items" = "All Items"; -"collections.my_publications" = "My Publications"; -"collections.trash" = "Trash"; +"collections.my_publications" = "Les meves publicacions"; +"collections.trash" = "Paperera"; "collections.unfiled" = "Unfiled Items"; "collections.new_subcollection" = "New Subcollection"; "collections.edit_title" = "Edit Collection"; @@ -151,7 +151,7 @@ "lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; "citation.title" = "Citation Preview"; -"citation.copy_citation" = "Copy Citation"; +"citation.copy_citation" = "Copia la citació"; "citation.copy_bibliography" = "Copy Bibliography"; "citation.preview" = "Preview"; "citation.omit_author" = "Omit Author"; @@ -159,12 +159,12 @@ "citation.locator.page" = "Pàgina"; "citation.locator.book" = "Book"; "citation.locator.chapter" = "Chapter"; -"citation.locator.column" = "Column"; +"citation.locator.column" = "Columna"; "citation.locator.figure" = "Figure"; "citation.locator.folio" = "Folio"; "citation.locator.issue" = "Issue"; "citation.locator.line" = "Line"; -"citation.locator.note" = "Note"; +"citation.locator.note" = "Nota"; "citation.locator.opus" = "Opus"; "citation.locator.paragraph" = "Paragraph"; "citation.locator.part" = "Part"; @@ -244,7 +244,7 @@ "pdf.annotation_share.image.large" = "Large"; "pdf.annotation_toolbar.eraser" = "Eraser"; "pdf.annotation_toolbar.highlight" = "Highlight"; -"pdf.annotation_toolbar.note" = "Note"; +"pdf.annotation_toolbar.note" = "Nota"; "pdf.annotation_toolbar.image" = "Image"; "pdf.annotation_toolbar.ink" = "Ink"; "pdf.annotation_toolbar.underline" = "Underline"; @@ -302,8 +302,8 @@ "settings.sync.account" = "Account"; "settings.sync.manage_account" = "Manage Account"; "settings.sync.delete_account" = "Delete Account"; -"settings.sync.username" = "Username"; -"settings.sync.password" = "Password"; +"settings.sync.username" = "Nom d'usuari"; +"settings.sync.password" = "Contrasenya"; "settings.sync.verify" = "Verify Server"; "settings.sync.directory_not_found.title" = "Directory not found"; "settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; diff --git a/Zotero/Assets/en-GB.lproj/Localizable.stringsdict b/Zotero/Assets/en-GB.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/en-GB.lproj/Localizable.stringsdict +++ b/Zotero/Assets/en-GB.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/es-AR.lproj/Localizable.strings b/Zotero/Assets/es-AR.lproj/Localizable.strings index e1a9def1d..da9e90cab 100644 --- a/Zotero/Assets/es-AR.lproj/Localizable.strings +++ b/Zotero/Assets/es-AR.lproj/Localizable.strings @@ -60,16 +60,16 @@ "close_without_saving" = "Cerrar sin guardar"; "stay" = "Permanecer"; -"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; -"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; -"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; +"migration_debug" = "La aplicación no se ha podido inicializar y no funciona correctamente. Por favor, informe del ID de depuración %@ en los foros de Zotero."; +"login_debug" = "La aplicación no ha podido iniciar sesión. Vuelva a iniciar sesión e informe del ID de depuración %@ en los foros de Zotero."; +"full_sync_debug" = "La sincronización completa ha finalizado. Por favor, informe del ID de depuración %@ en los foros de Zotero."; -"day_suffixes" = "st,nd,rd,th"; +"day_suffixes" = ".º"; "onboarding.access" = "Zotero organiza la investigación como usted desee. Clasifique sus elementos en colecciones y etiquételos con palabras clave."; -"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; -"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; -"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sync" = "Sincronizar y colaborar en todos los dispositivos, manteniendo sus lecturas y notas perfectamente actualizadas."; +"onboarding.annotate" = "Resalte y tome notas directamente en sus archivos PDF mientras los lee."; +"onboarding.share" = "Toca para recopilar artículos y libros directamente desde la web, incluyendo sus archivos PDF y metadatos completos."; "onboarding.sign_in" = "Acceder"; "onboarding.create_account" = "Registrarse"; "login.username" = "Nombre de usuario"; @@ -80,7 +80,7 @@ "libraries.my_library" = "Mi biblioteca"; "libraries.group_libraries" = "Bibliotecas de grupo"; -"libraries.delete_question" = "Do you really want to delete “%@”?"; +"libraries.delete_question" = "¿De verdad quiere eliminar «%@»?"; "collections.search_title" = "Buscar colección"; "collections.all_items" = "Todos los elementos"; @@ -92,7 +92,7 @@ "collections.delete" = "Eliminar colección"; "collections.delete_with_items" = "Eliminar colección y elementos"; "collections.create_title" = "Crear colección"; -"collections.picker_title" = "Choose Parent"; +"collections.picker_title" = "Elegir principal"; "collections.empty_trash" = "Vaciar la papelera"; "collections.collapse_all" = "Contraer todo"; "collections.expand_all" = "Expandir todo"; @@ -107,34 +107,34 @@ "sync_toolbar.object" = "Sincronizando %@ en %@"; "sync_toolbar.object_with_data" = "Sincronizando %@ (%d / %d) en %@"; "sync_toolbar.finished" = "Sincronización completada"; -"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.deletion" = "Aplicando eliminaciones remotas en %@"; "sync_toolbar.aborted" = "Error de sincronización (%@)"; -"sync_toolbar.writes" = "Uploading changes (%d / %d)"; -"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.writes" = "Cargando cambios (%d / %d)"; +"sync_toolbar.uploads" = "Subiendo adjunto (%d / %d)"; "sync_toolbar.object.collections" = "colecciones"; "sync_toolbar.object.groups" = "grupos"; "sync_toolbar.object.items" = "elementos"; "sync_toolbar.object.searches" = "búsquedas"; -"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; +"sync.conflict_resolution.changed_item_deleted" = "El elemento «%@» se ha eliminado. ¿Desea conservar los cambios?"; "items.search_title" = "Buscar elementos"; "items.select_all" = "Seleccionar todo"; "items.deselect_all" = "Deseleccionar todo"; "items.sort_by" = "Ordenar por"; "items.sort_order" = "Orden de clasificación"; -"items.ascending" = "Ascending"; +"items.ascending" = "Ascendente"; "items.descending" = "Descendiendo"; "items.lookup" = "Añadir por identificador"; "items.barcode" = "Escanear código de barras"; "items.new" = "Añadir manualmente"; -"items.new_note" = "New Standalone Note"; +"items.new_note" = "Nueva nota independiente"; "items.new_file" = "Añadir archivo"; "items.remove_from_collection_title" = "Eliminar de la colección"; "items.action.add_to_collection" = "Añadir a la colección"; "items.action.remove_from_collection" = "Eliminar de la colección"; "items.action.duplicate" = "Duplicar"; -"items.action.create_parent" = "Create Parent Item"; +"items.action.create_parent" = "Crear elemento principal"; "items.action.download" = "Descargar"; "items.action.remove_download" = "Eliminar Descargar"; "items.action.retrieve_metadata" = "Recuperar metadatos"; @@ -169,16 +169,16 @@ "citation.locator.paragraph" = "Párrafo"; "citation.locator.part" = "Parte"; "citation.locator.section" = "Sección"; -"citation.locator.sub verbo" = "Sub verbo"; +"citation.locator.sub verbo" = "Bajo la palabra"; "citation.locator.volume" = "Volumen"; "citation.locator.verse" = "Verso"; "citation.style" = "Estilo"; "citation.language" = "Idioma"; -"citation.output_mode" = "Output Mode"; +"citation.output_mode" = "Modo de salida"; "citation.citations" = "Citas"; "citation.bibliography" = "Bibliografía"; "citation.notes" = "Notas"; -"citation.output_method" = "Output Method"; +"citation.output_method" = "Método de salida"; "citation.save_html" = "Guardar como HTML"; "citation.copy" = "Copiar a portapapeles"; @@ -199,17 +199,17 @@ "item_detail.delete_attachment_file" = "Eliminar Descargar"; "item_detail.deleted_title" = "Eliminado"; "item_detail.deleted_message" = "Este elemento ha sido eliminado. ¿Desea restaurarlo?"; -"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; +"item_detail.move_to_standalone_attachment" = "Convertir a archivo adjunto independiente"; "tag_picker.title" = "%d seleccionado"; "tag_picker.placeholder" = "Nombre de etiqueta"; "tag_picker.create_tag" = "Crear etiqueta “%@”"; -"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; -"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.confirm_deletion_question" = "Eliminar etiquetas automáticas"; +"tag_picker.search_placeholder" = "Etiquetas de búsqueda"; "tag_picker.deselect_all" = "Deseleccionar todo"; -"tag_picker.show_auto" = "Show Automatic Tags"; -"tag_picker.show_all" = "Display All Tags in This Library"; -"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; +"tag_picker.show_auto" = "Mostrar etiquetas automáticas"; +"tag_picker.show_all" = "Mostrar todas las etiquetas de esta biblioteca"; +"tag_picker.delete_automatic" = "Eliminar etiquetas automáticas en esta biblioteca"; "creator_editor.creator" = "Tipo de creador"; "creator_editor.first_name" = "Nombre"; @@ -219,19 +219,19 @@ "creator_editor.delete_confirmation" = "¿De verdad quieres eliminar este creador?"; "pdf.annotations_sidebar.search_title" = "Buscar"; -"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_comment" = "Añadir comentario"; "pdf.annotations_sidebar.add_tags" = "Añadir etiquetas"; "pdf.annotations_sidebar.merge" = "Fusionar"; "pdf.annotations_sidebar.filter.title" = "Filtrar anotaciones"; "pdf.annotations_sidebar.filter.tags_placeholder" = "Seleccionar etiquetas..."; -"pdf.search.title" = "Search in Document"; +"pdf.search.title" = "Buscar en el documento"; "pdf.search.failed" = "La búsqueda no ha dado resultados"; -"pdf.search.dismiss" = "Dismiss Search"; +"pdf.search.dismiss" = "Descartar búsqueda"; "pdf.annotation_popover.title" = "Editar anotación"; "pdf.annotation_popover.delete" = "Eliminar anotación"; -"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; -"pdf.annotation_popover.page_label_title" = "Edit Page Number"; -"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.update_subsequent_pages" = "Actualizar páginas siguientes"; +"pdf.annotation_popover.page_label_title" = "Editar número de página"; +"pdf.annotation_popover.no_comment" = "Sin comentario"; "pdf.annotation_popover.line_width" = "Ancho"; "pdf.annotation_popover.size" = "Tamaño"; "pdf.deleted_title" = "Eliminado"; @@ -240,27 +240,27 @@ "pdf.highlight" = "Destacar"; "pdf.underline" = "Subrayar"; "pdf.annotation_share.image.share" = "Compartir imagen"; -"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.medium" = "Medio"; "pdf.annotation_share.image.large" = "Grande"; "pdf.annotation_toolbar.eraser" = "Goma de borrar"; "pdf.annotation_toolbar.highlight" = "Destacar"; "pdf.annotation_toolbar.note" = "Nota"; -"pdf.annotation_toolbar.image" = "Image"; -"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.image" = "Imagen"; +"pdf.annotation_toolbar.ink" = "Tinta"; "pdf.annotation_toolbar.underline" = "Subrayar"; "pdf.annotation_toolbar.text" = "Texto"; "pdf.locked.locked" = "Bloqueado"; -"pdf.locked.enter_password" = "Please enter the password to open this PDF."; -"pdf.locked.failed" = "Incorrect password. Please try again."; -"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.locked.enter_password" = "Introduzca la contraseña para abrir este PDF."; +"pdf.locked.failed" = "Contraseña incorrecta. Inténtalo de nuevo."; +"pdf.settings.scroll_direction.title" = "Dirección de desplazamiento"; "pdf.settings.scroll_direction.horizontal" = "Horizontal"; "pdf.settings.scroll_direction.vertical" = "Vertical"; "pdf.settings.page_transition.title" = "Transición de página"; "pdf.settings.page_transition.jump" = "Saltar"; "pdf.settings.page_transition.continuous" = "Continuo"; -"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.title" = "Apariencia"; "pdf.settings.appearance.auto" = "Automático"; -"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.light_mode" = "Luz"; "pdf.settings.appearance.dark_mode" = "Oscuro"; "pdf.settings.appearance.sepia_mode" = "Sepia"; "pdf.settings.page_mode.title" = "Modo de página"; @@ -271,182 +271,182 @@ "pdf.settings.page_fitting.fit" = "Ajustar"; "pdf.settings.page_fitting.fill" = "Rellenar"; "pdf.settings.page_spreads.title" = "Páginas dobles"; -"pdf.settings.page_spreads.odd" = "Odd"; -"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_spreads.odd" = "Extraño"; +"pdf.settings.page_spreads.even" = "Incluso"; "pdf.settings.page_fitting.automatic" = "Automático"; "pdf.export.export" = "Exportar PDF"; "pdf.export.export_annotated" = "Exportar PDF anotado"; "pdf.sidebar.no_annotations" = "Sin anotaciones"; -"pdf.sidebar.no_outline" = "No Outline"; -"pdf.delete_annotation" = "Do you really want to delete this annotation?"; -"pdf.previous_page" = "Previous Page"; +"pdf.sidebar.no_outline" = "Sin esquema"; +"pdf.delete_annotation" = "¿De verdad quiere eliminar esta anotación?"; +"pdf.previous_page" = "Página anterior"; "pdf.next_page" = "Página siguiente"; -"pdf.previous_viewport" = "Previous Viewport"; -"pdf.next_viewport" = "Next Viewport"; +"pdf.previous_viewport" = "Vista previa anterior"; +"pdf.next_viewport" = "Siguiente ventana gráfica"; "settings.title" = "Ajustes"; "settings.logout" = "Cerrar sesión"; -"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.logout_warning" = "Se eliminarán todos los datos locales que no se hayan sincronizado. ¿De verdad quieres cerrar sesión?"; "settings.general.title" = "General"; -"settings.general.show_subcollections_title" = "Show Items from Subcollections"; -"settings.general.show_collection_item_counts" = "Show Collection Sizes"; -"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; -"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.show_subcollections_title" = "Mostrar elementos de subcolecciones"; +"settings.general.show_collection_item_counts" = "Mostrar tamaños de colección"; +"settings.general.open_links_in_external_browser" = "Abrir enlaces en un navegador externo"; +"settings.general.autoempty_title" = "Eliminar elementos de la papelera"; "settings.general.never" = "Nunca"; -"settings.item_count" = "Item count"; -"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.item_count" = "Recuento de elementos"; +"settings.item_count_subtitle" = "Mostrar el recuento de elementos de todas las colecciones."; "settings.sync.title" = "Cuenta"; "settings.sync.data_syncing" = "Sincronización de datos"; -"settings.sync.file_syncing" = "File Syncing"; -"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.file_syncing" = "Sincronización de archivos"; +"settings.sync.file_syncing_type_message" = "Sincronizar archivos adjuntos en Mi biblioteca utilizando"; "settings.sync.account" = "Cuenta"; -"settings.sync.manage_account" = "Manage Account"; +"settings.sync.manage_account" = "Gestionar cuenta"; "settings.sync.delete_account" = "Eliminar cuenta"; "settings.sync.username" = "Nombre de usuario"; "settings.sync.password" = "Contraseña"; "settings.sync.verify" = "Verificar servidor"; "settings.sync.directory_not_found.title" = "Directorio no encontrado"; -"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.directory_not_found.message" = "%@ no existe.\n\n¿Desea crearlo ahora?"; "settings.sync.verified" = "Verificado"; "settings.permission" = "Permiso de usuario"; -"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.permission_subtitle" = "Solicitar permiso al usuario para cada acción de escritura"; "settings.translators" = "Traductores"; "settings.translators_update" = "Actualizar traductores"; "settings.translators_updating" = "Actualizando..."; -"settings.reset_to_bundled" = "Reset to bundled"; -"settings.debug" = "Debug Output Logging"; +"settings.reset_to_bundled" = "Restablecer a la configuración predeterminada"; +"settings.debug" = "Registro de salida de depuración"; "settings.logging_title" = "Iniciar sesión"; "settings.start_logging" = "Comenzar iniciar sesión"; "settings.start_logging_on_launch" = "Iniciar sesión en el próximo inicio de la aplicación"; "settings.cancel_logging" = "Cancelar iniciar sesión"; "settings.stop_logging" = "Parar iniciar sesión"; "settings.view_output" = "Ver salida"; -"settings.clear_output" = "Clear Output"; -"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; -"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.clear_output" = "Borrar la salida"; +"settings.logging_desc1" = "Para solucionar un problema de inicio, fuerce el cierre de la aplicación y vuelva a iniciarla."; +"settings.logging_desc2" = "Para depurar un problema de extensión compartida, abra la extensión compartida."; "settings.send_manually" = "Enviar manualmente"; -"settings.log_alert.progress_title" = "Sending Logs"; -"settings.log_alert.title" = "Logs Sent"; -"settings.log_alert.message" = "Your Debug ID is %@"; -"settings.crash_alert.title" = "Crash Log Sent"; -"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; -"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; -"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; -"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.log_alert.progress_title" = "Envío de registros"; +"settings.log_alert.title" = "Registros enviados"; +"settings.log_alert.message" = "Su ID de depuración es %@"; +"settings.crash_alert.title" = "Registro de fallos enviado"; +"settings.crash_alert.message" = "Su ID de informe es %@.\n\nPor favor, publique un mensaje en los foros de Zotero (forums.zotero.org) con este ID de informe y los pasos necesarios para reproducir el fallo."; +"settings.crash_alert.message_with_db" = "Su ID de informe es %@.\n\nPor favor, publica un mensaje en los foros de Zotero (forums.zotero.org) con este ID de informe y los pasos necesarios para reproducir el fallo.\n\nSi Zotero falla repetidamente, pulsa «Exportar base de datos» y envía los archivos exportados a support@zotero.org."; +"settings.crash_alert.submit_forum" = "Enviar a los foros de Zotero"; +"settings.crash_alert.export_db" = "Copiar y exportar base de datos"; "settings.crash_alert.copy" = "Copiar a portapapeles"; -"settings.websocket_title" = "Server Connection"; +"settings.websocket_title" = "Conexión al servidor"; "settings.websocket_connected" = "Conectado"; "settings.websocket_connecting" = "Conectando"; "settings.websocket_disconnected" = "Desconectado"; -"settings.websocket_disconnect" = "Disconnect from Server"; -"settings.websocket_connect" = "Connect to Server"; -"settings.storage" = "Local Storage"; -"settings.storage.delete_all" = "Delete All Local Attachment Files"; -"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; -"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; -"settings.saving.title" = "Saving"; +"settings.websocket_disconnect" = "Desconectar del servidor"; +"settings.websocket_connect" = "Conectarse al servidor"; +"settings.storage" = "Almacenamiento local"; +"settings.storage.delete_all" = "Eliminar todos los archivos adjuntos locales"; +"settings.storage.delete_all_question" = "¿Está seguro de que desea eliminar todos los archivos adjuntos de este dispositivo?\n\nLos demás dispositivos sincronizados no se verán afectados."; +"settings.storage.delete_library_question" = "¿Está seguro de que desea eliminar todos los archivos adjuntos en %@ de este dispositivo?\n\nLos demás dispositivos sincronizados no se verán afectados."; +"settings.saving.title" = "Guardando"; "settings.saving.files_title" = "Guardar archivos"; -"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; -"settings.saving.tags_title" = "Save Automatic Tags"; -"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; -"settings.cite.title" = "Cite"; -"settings.cite.styles_title" = "Citation Styles"; -"settings.cite.get_more_styles" = "Get additional styles"; -"settings.cite_search.search_title" = "Search styles"; +"settings.saving.files_message" = "Adjuntar automáticamente los archivos PDF y otros archivos asociados al guardar elementos"; +"settings.saving.tags_title" = "Guardar etiquetas automáticas"; +"settings.saving.tags_message" = "Etiqueta automáticamente los elementos con palabras clave y encabezados temáticos."; +"settings.cite.title" = "Citar"; +"settings.cite.styles_title" = "Estilos de citación"; +"settings.cite.get_more_styles" = "Obtenga estilos adicionales"; +"settings.cite_search.search_title" = "Estilos de búsqueda"; "settings.export.title" = "Copia rápida"; "settings.export.default_format" = "Formato predeterminado"; "settings.export.language" = "Idioma"; "settings.export.copy_as_html" = "Copiar como HTML"; -"settings.versionAndBuild" = "Version %@ Build %@"; -"settings.export_db" = "Export Database File"; -"settings.full_sync_debug" = "Advanced"; -"settings.full_sync.start" = "Start Full Sync Debugging"; -"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; -"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.versionAndBuild" = "Versión %@ Compilación %@"; +"settings.export_db" = "Exportar archivo de base de datos"; +"settings.full_sync_debug" = "Avanzado"; +"settings.full_sync.start" = "Iniciar depuración de sincronización completa"; +"settings.full_sync.other_in_progress" = "Ya se está realizando una sincronización. Espere a que finalice."; +"settings.full_sync.in_progress" = "Se está realizando una sincronización completa. Espere a que finalice y publique el ID de depuración en los foros de Zotero."; "settings.annotation_tools" = "Herramientas de anotación"; "settings.annotation_tools.pdf" = "PDF"; "settings.annotation_tools.html_epub" = "HTML / EPUB"; "settings.annotation_tools.reset" = "Restablecer"; -"shareext.save" = "Save to Zotero"; -"shareext.decoding_attachment" = "Searching for items"; -"shareext.translation.item_selection" = "Choose an item"; -"shareext.translation.translating_with" = "Saving with %@"; +"shareext.save" = "Guardar en Zotero"; +"shareext.decoding_attachment" = "Búsqueda de elementos"; +"shareext.translation.item_selection" = "Elija un elemento"; +"shareext.translation.translating_with" = "Guardando con %@"; "shareext.loading_collections" = "Cargando colecciones"; -"shareext.sync_error" = "Unable to sync collections"; -"shareext.collection_other" = "More"; +"shareext.sync_error" = "No se pueden sincronizar las colecciones"; +"shareext.collection_other" = "Más"; "shareext.item_title" = "Elemento"; "shareext.collection_title" = "Colección"; "shareext.tags_title" = "Etiquetas"; "searchbar.placeholder" = "Buscar"; -"searchbar.accessibility_cancel" = "Cancel Search"; -"searchbar.accessibility_clear" = "Clear Search"; +"searchbar.accessibility_cancel" = "Cancelar búsqueda"; +"searchbar.accessibility_clear" = "Limpiar búsqueda"; -"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; -"errors.parsing" = "Could not parse some data. Other data will continue to sync."; -"errors.api" = "Failed API response: %@"; -"errors.db" = "Could not connect to database. The device storage might be full."; -"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.schema" = "No se han podido descargar algunos datos de Mi biblioteca. Es posible que se hayan guardado con una versión más reciente de Zotero.\n\nEl resto de datos se seguirán sincronizando."; +"errors.parsing" = "No se han podido analizar algunos datos. El resto de datos se seguirán sincronizando."; +"errors.api" = "Respuesta API fallida: %@"; +"errors.db" = "No se pudo conectar a la base de datos. Es posible que el almacenamiento del dispositivo esté lleno."; +"errors.versionMismatch" = "Se realizó un cambio remoto durante la sincronización"; "errors.unknown" = "Error desconocido"; -"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; -"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; -"errors.attachments.cant_open_attachment" = "The attached file could not be found."; -"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; -"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; -"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; -"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; -"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; -"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; -"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.cant_unzip_snapshot" = "No se puede descomprimir la instantánea"; +"errors.attachments.incompatible_attachment" = "Los archivos vinculados no son compatibles con dispositivos móviles. Puede abrirlos utilizando la aplicación de escritorio Zotero."; +"errors.attachments.cant_open_attachment" = "No se ha encontrado el archivo adjunto."; +"errors.attachments.missing_zotero" = "El archivo adjunto no está disponible en la biblioteca en línea."; +"errors.attachments.missing_webdav" = "El archivo adjunto no está disponible en el servidor WebDAV."; +"errors.attachments.missing_additional" = "Compruebe que el archivo se haya sincronizado en el dispositivo donde se añadió."; +"errors.attachments.unauthorized_webdav" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que ha guardado en los ajustes."; +"errors.attachments.too_many_requests_webdav" = "El servidor WebDAV está limitando sus solicitudes. Vuelva a intentarlo en unos minutos o compruebe sus credenciales de inicio de sesión."; +"errors.attachments.too_many_requests" = "Demasiadas solicitudes. Vuelva a intentarlo en unos minutos."; +"errors.attachments.forbidden_webdav" = "No tiene permiso para acceder a %@ en el servidor WebDAV."; "errors.attachments.generic_filename" = "el archivo"; "errors.login.invalid_password" = "Contraseña no válida"; "errors.login.invalid_username" = "Nombre de usuario inválido"; "errors.login.invalid_credentials" = "Nombre de usuario o contraseña no válidos"; -"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.libraries.cantLoad" = "No se pueden cargar las bibliotecas"; "errors.collections.empty_name" = "Introduzca un nombre para la colección"; "errors.collections.save_failed" = "No se puede guardar la colección"; "errors.collections.bibliography_failed" = "No se pudieron cargar los elementos para la bibliografía"; -"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; -"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.group_removed" = "El grupo \"%@\" ya no es accesible. ¿Qué desea hacer?"; +"errors.sync.metadata_write_denied" = "Ya no puede escribir al grupo \"%@\". ¿Qué quiere hacer?"; "errors.sync.revert_to_original" = "Volver al original"; -"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; -"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.file_write_denied" = "Ya no tiene acceso para editar archivos del grupo \"%@\", y los archivos que haya modificado localmente no se pueden cargar. Si continúa, todos los archivos del grupo se restablecerán a su estado en %@.\n\nSi desea copiar los archivos modificados en otra ubicación o solicitar acceso para editar archivos a un administrador del grupo, puede omitir la sincronización del grupo ahora."; +"errors.sync.reset_group_files" = "Restablecer archivos de grupo y sincronizar"; "errors.sync.skip_group" = "Saltar grupo"; "errors.sync_toolbar.finished_with_errors" = "Sincronización completada (%@)"; -"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; -"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; -"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; -"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.attachment_missing" = "No se puede cargar el archivo adjunto: %@. Intente eliminar y volver a añadir el archivo adjunto."; +"errors.sync_toolbar.libraries_missing" = "No se han encontrado bibliotecas. Cierre la sesión y vuelva a iniciarla."; +"errors.sync_toolbar.groups_failed" = "No se pudieron sincronizar los grupos. Inténtelo de nuevo."; +"errors.sync_toolbar.conflict_retry_limit" = "Sincronización remota en curso. Vuelva a intentarlo en unos minutos."; "errors.sync_toolbar.group_permissions" = "No tienes permiso para editar grupos."; -"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; -"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; -"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.internet_connection" = "No se puede conectar a la red. Inténtelo de nuevo."; +"errors.sync_toolbar.personal_quota_reached" = "Ha alcanzado su cuota de almacenamiento de Zotero. Algunos archivos no se han cargado. El resto de datos de Zotero seguirán sincronizándose.\n\nConsulte la configuración de su cuenta de zotero.org para ver opciones de almacenamiento adicionales."; +"errors.sync_toolbar.group_quota_reached" = "El grupo \"%@\" ha alcanzado su cuota de almacenamiento en Zotero. Algunos archivos no se han subido. El resto de datos de Zotero seguirán sincronizándose.\n\nEl propietario del grupo puede aumentar la capacidad de almacenamiento del grupo desde la configuración de almacenamiento en zotero.org."; +"errors.sync_toolbar.insufficient_space" = "No dispone de suficiente espacio en su servidor WebDAV. Algunos archivos no se han cargado. El resto de datos de Zotero seguirán sincronizándose."; "errors.sync_toolbar.quota_reached_short" = "Cuota alcanzada."; -"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; -"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; -"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.unavailable" = "Los servicios de Zotero no están disponibles temporalmente. Vuelva a intentarlo en unos minutos."; +"errors.sync_toolbar.webdav_error" = "No se pudieron eliminar los archivos del servidor WebDAV: «%@»."; +"errors.sync_toolbar.webdav_item_prop" = "Archivo prop no válido: %@"; "errors.sync_toolbar.show_item" = "Mostrar elemento"; "errors.sync_toolbar.show_items" = "Mostrar elementos"; "errors.sync_toolbar.forbidden" = "Nombre de usuario o contraseña no válidos"; -"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; -"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; -"errors.items.loading" = "Could not load items"; -"errors.items.deletion" = "Could not remove item"; -"errors.items.deletion_from_collection" = "Could not remove item from collection"; -"errors.items.add_to_collection" = "Could not add item to collection"; -"errors.items.move_item" = "Could not move item"; +"errors.sync_toolbar.forbidden_message" = "El servidor de sincronización de Zotero no ha aceptado su nombre de usuario y contraseña.\n\nCierre la sesión e inicie sesión con la información de inicio de sesión correcta."; +"errors.sync_toolbar.webdav_request_failed" = "Su servidor WebDAV devolvió un error HTTP %d para una solicitud %@."; +"errors.items.loading" = "No se pudieron cargar los elementos"; +"errors.items.deletion" = "No se pudo eliminar el elemento"; +"errors.items.deletion_from_collection" = "No se pudo eliminar el elemento de la colección."; +"errors.items.add_to_collection" = "No se pudo añadir el artículo a la colección"; +"errors.items.move_item" = "No se pudo mover el elemento"; "errors.items.save_note" = "No se pudo guardar la nota."; -"errors.items.add_attachment" = "Could not add attachment"; -"errors.items.add_some_attachments" = "Some attachments were not added: %@"; -"errors.items.load_duplication" = "Could not load item to duplicate"; -"errors.items.generating_bib" = "Could not generate bibliography"; -"errors.citation_preview" = "Could not generate citation preview"; -"errors.item_detail.dropped_fields_title" = "Change Item Type"; -"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; -"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; -"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.items.add_attachment" = "No se pudo añadir el archivo adjunto"; +"errors.items.add_some_attachments" = "Algunos archivos adjuntos no se han añadido: %@"; +"errors.items.load_duplication" = "No se pudo cargar el elemento para duplicarlo"; +"errors.items.generating_bib" = "No se pudo generar la bibliografía"; +"errors.citation_preview" = "No se pudo generar la vista previa de la cita."; +"errors.item_detail.dropped_fields_title" = "Cambiar tipo de artículo"; +"errors.item_detail.dropped_fields_message" = "¿Está seguro de que desea cambiar el tipo de elemento?\n\nSe perderán los siguientes campos:\n\n%@"; +"errors.item_detail.cant_load_data" = "No se pudieron cargar los datos. Inténtelo de nuevo."; +"errors.item_detail.cant_create_attachments_with_names" = "No se pudieron crear los archivos adjuntos: %@"; "errors.item_detail.cant_create_attachments" = "No se pudieron crear los archivos adjuntos"; "errors.item_detail.cant_save_note" = "No se pudo guardar la nota."; "errors.item_detail.cant_save_changes" = "No se pudieron guardar los cambios"; @@ -454,7 +454,7 @@ "errors.item_detail.cant_save_tags" = "No se pudieron guardar las etiquetas"; "errors.item_detail.unsupported_type" = "El tipo \"%@\" no es compatible"; "errors.settings.storage" = "No se pudieron recopilar los datos de almacenamiento."; -"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.file_missing_after_upload" = "Se ha detectado un posible problema con su servidor WebDAV.\n\nUn archivo cargado no estaba disponible inmediatamente para su descarga. Es posible que se produzca un breve retraso entre el momento en que se cargan los archivos y el momento en que están disponibles, especialmente si utiliza un servicio de almacenamiento en la nube.\n\nSi la sincronización de archivos de Zotero parece funcionar con normalidad, puede ignorar este mensaje. Si tiene algún problema, publique un mensaje en los foros de Zotero."; "errors.settings.webdav.invalid_url" = "Error de verificación de WebDAV"; "errors.settings.webdav.no_password" = "Error de verificación de WebDAV"; "errors.settings.webdav.no_url" = "Error de verificación de WebDAV"; @@ -465,54 +465,54 @@ "errors.settings.webdav.zotero_dir_not_found" = "Error de verificación de WebDAV"; "errors.settings.webdav.unauthorized" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que introdujo."; "errors.settings.webdav.forbidden" = "No tiene permiso para acceder a la carpeta especificada en el servidor WebDAV."; -"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; -"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; -"errors.shareext.logged_out" = "Please log into the app before using this extension."; -"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; -"errors.shareext.unknown" = "An unknown error occurred."; -"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; -"errors.shareext.download_failed" = "Could not download file"; -"errors.shareext.items_not_found" = "No items found on page"; -"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.settings.webdav.internet_connection" = "No se puede conectar a la red. Inténtelo de nuevo."; +"errors.settings.webdav.host_not_found" = "No se pudo conectar al servidor WebDAV"; +"errors.settings.webdav.ats" = "Debido a las restricciones de iOS, debe utilizar HTTPS para conectarse a un servidor WebDAV no local."; +"errors.shareext.logged_out" = "Inicie sesión en la aplicación antes de utilizar esta extensión."; +"errors.shareext.cant_load_data" = "No se han podido cargar los datos. Inténtelo de nuevo."; +"errors.shareext.unknown" = "Se ha producido un error desconocido."; +"errors.shareext.cant_load_schema" = "Se ha producido un error. Abra la aplicación Zotero, sincronícela e inténtelo de nuevo."; +"errors.shareext.download_failed" = "No se pudo descargar el archivo."; +"errors.shareext.items_not_found" = "No se han encontrado elementos en la página"; +"errors.shareext.schema_error" = "No se han podido descargar algunos datos. Es posible que se hayan guardado con una versión más reciente de Zotero."; "errors.shareext.translation_failed" = "Error al guardar"; -"errors.shareext.response_missing_data" = "An error occurred. Please try again."; -"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; -"errors.shareext.file_not_pdf" = "Unable to save PDF"; -"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; -"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; -"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; -"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; -"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.response_missing_data" = "Se ha producido un error. Inténtelo de nuevo."; +"errors.shareext.failed_additional" = "Aún puede guardar esta página como un elemento de página web."; +"errors.shareext.file_not_pdf" = "No se puede guardar el PDF"; +"errors.shareext.api_error" = "Error al cargar el elemento. El elemento se guardó en su biblioteca local."; +"errors.shareext.webdav_error" = "Error al cargar el archivo adjunto al servidor WebDAV"; +"errors.shareext.personal_quota_reached" = "Ha alcanzado su cuota de almacenamiento de Zotero y no se ha podido cargar el archivo. Consulte la configuración de su cuenta para ver opciones de almacenamiento adicionales.\n\nEl archivo se ha guardado en su biblioteca local."; +"errors.shareext.group_quota_reached" = "El grupo \"%@\" ha alcanzado su cuota de almacenamiento en Zotero y no se ha podido cargar el archivo. El propietario del grupo puede consultar la configuración de su cuenta para obtener opciones de almacenamiento adicionales.\n\nEl archivo se ha guardado en la biblioteca local."; +"errors.shareext.forbidden" = "No tiene los permisos necesarios para añadir este elemento a %@."; "errors.shareext.webdav_not_verified" = "Error de verificación de WebDAV"; -"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; -"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.shareext.requires_browser" = "Este contenido debe cargarse en un navegador para poder compartirlo con Zotero. Ábralo en su navegador y utilice el botón Compartir del navegador."; +"errors.db_failure" = "Error al crear la base de datos. Intente iniciar sesión de nuevo."; "errors.logging.title" = "Error de depuración"; -"errors.logging.start" = "Unable to start debug logging"; -"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; -"errors.logging.upload" = "Could not upload logs. Please try again."; -"errors.logging.response_parsing" = "Unexpected response from server"; -"errors.translators.bundle_loading" = "Could not update translators. Try again?"; -"errors.styles.addition" = "Could not add style “%@”"; -"errors.styles.deletion" = "Could not delete style “%@”"; -"errors.styles.loading" = "Could not load styles"; -"errors.styles_search.loading" = "Could not load styles. Try again?"; -"errors.citation.generate_citation" = "Could not generate citation"; -"errors.citation.generate_bibliography" = "Could not generate bibliography"; -"errors.citation.invalid_types" = "Invalid item types selected"; -"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.logging.start" = "No se puede iniciar el registro de depuración"; +"errors.logging.no_logs_recorded" = "No se produjo ninguna salida de depuración durante el registro"; +"errors.logging.upload" = "No se pudieron cargar los registros. Inténtelo de nuevo."; +"errors.logging.response_parsing" = "Respuesta inesperada del servidor"; +"errors.translators.bundle_loading" = "No se han podido actualizar los traductores. ¿Desea volver a intentarlo?"; +"errors.styles.addition" = "No se pudo añadir el estilo «%@»"; +"errors.styles.deletion" = "No se pudo eliminar el estilo «%@»"; +"errors.styles.loading" = "No se pudieron cargar los estilos."; +"errors.styles_search.loading" = "No se pudieron cargar los estilos. ¿Desea volver a intentarlo?"; +"errors.citation.generate_citation" = "No se pudo generar la cita"; +"errors.citation.generate_bibliography" = "No se pudo generar la bibliografía"; +"errors.citation.invalid_types" = "Tipos de elementos no válidos seleccionados"; +"errors.citation.missing_style" = "No se ha seleccionado ningún estilo de cita. Vaya a Ajustes → Copia rápida y seleccione un nuevo estilo."; "errors.citation.open_settings" = "Abrir ajustes"; -"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; -"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; -"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; -"errors.pdf.merge_too_big" = "The combined annotation would be too large."; -"errors.pdf.cant_update_annotation" = "Can’t update annotation"; -"errors.pdf.cant_add_annotations" = "Can’t add annotations"; -"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; -"errors.pdf.incompatible_document" = "This document is not supported."; -"errors.pdf.empty_document" = "This document is empty."; -"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; -"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero no ha podido encontrar ningún identificador en tu entrada. Compruebe su entrada e inténtelo de nuevo."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero no ha podido encontrar ningún identificador nuevo en tu entrada, o ya se han añadido. Compruebe tu entrada e inténtelo de nuevo."; +"errors.pdf.merge_too_big_title" = "No se pueden combinar las anotaciones"; +"errors.pdf.merge_too_big" = "La anotación combinada sería demasiado grande."; +"errors.pdf.cant_update_annotation" = "No se puede actualizar la anotación"; +"errors.pdf.cant_add_annotations" = "No se pueden añadir anotaciones"; +"errors.pdf.cant_delete_annotations" = "No se pueden eliminar las anotaciones"; +"errors.pdf.incompatible_document" = "Este documento no es compatible"; +"errors.pdf.empty_document" = "Este documento está vacío."; +"errors.pdf.page_index_not_int" = "Formato incorrecto de la página almacenada para este documento"; +"errors.pdf.document_changed" = "Este documento ha sido modificado en otro dispositivo. Vuelva a abrirlo para continuar editándolo."; "accessibility.untitled" = "Título"; "accessibility.locked" = "Bloqueado"; @@ -536,11 +536,11 @@ "accessibility.items.restore" = "Restaurar elementos seleccionados"; "accessibility.items.duplicate" = "Duplicar elemento seleccionado"; "accessibility.items.share" = "Compartir elementos seleccionados"; -"accessibility.items.download_attachments" = "Download attachments for selected items"; -"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.download_attachments" = "Descargar archivos adjuntos para los elementos seleccionados"; +"accessibility.items.remove_downloads" = "Eliminar descargas de los elementos seleccionados"; "accessibility.items.collection" = "Colección"; -"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; -"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.item_detail.download_and_open" = "Pulsa dos veces para descargar y abrir"; +"accessibility.item_detail.open" = "Pulsa dos veces para abrir"; "accessibility.pdf.sidebar_open" = "Abrir barra lateral"; "accessibility.pdf.sidebar_close" = "Cerrar barra lateral"; "accessibility.pdf.share" = "Compartir PDF"; @@ -555,23 +555,23 @@ "accessibility.pdf.underline_annotation_tool" = "Crear anotación de subrayado"; "accessibility.pdf.text_annotation_tool" = "Crear anotación de texto"; "accessibility.pdf.eraser_annotation_tool" = "Goma de borrar"; -"accessibility.pdf.highlight_annotation" = "Highlight annotation"; -"accessibility.pdf.note_annotation" = "Note annotation"; -"accessibility.pdf.image_annotation" = "Image annotation"; -"accessibility.pdf.ink_annotation" = "Ink annotation"; -"accessibility.pdf.underline_annotation" = "Underline annotation"; -"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.highlight_annotation" = "Resaltar anotación"; +"accessibility.pdf.note_annotation" = "Anotación de nota"; +"accessibility.pdf.image_annotation" = "Anotación de imágenes"; +"accessibility.pdf.ink_annotation" = "Anotación en tinta"; +"accessibility.pdf.underline_annotation" = "Subrayar anotación"; +"accessibility.pdf.text_annotation" = "Anotación de texto"; "accessibility.pdf.edit_annotation" = "Editar anotación"; "accessibility.pdf.share_annotation" = "Compartir anotación"; -"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.share_annotation_image" = "Compartir imagen de anotación"; "accessibility.pdf.eraser_annotation" = "Goma de borrar"; -"accessibility.pdf.highlighted_text" = "Highlighted text"; -"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.highlighted_text" = "Texto resaltado"; +"accessibility.pdf.underlined_text" = "Texto subrayado"; "accessibility.pdf.author" = "Autor"; "accessibility.pdf.comment" = "Comentario"; "accessibility.pdf.tags" = "Etiquetas"; -"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; -"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.annotation_hint" = "Pulse dos veces para seleccionar y editar."; +"accessibility.pdf.tags_hint" = "Pulsa dos veces para editar las etiquetas."; "accessibility.pdf.selected" = "Seleccionados"; "accessibility.pdf.search_pdf" = "Buscar PDF"; "accessibility.pdf.redo" = "Rehacer"; @@ -581,12 +581,12 @@ "accessibility.htmlepub.search_html" = "Buscar sitio web"; "accessibility.htmlepub.search_epub" = "Buscar EPUB"; "accessibility.speech.play" = "Empieza a hablar"; -"accessibility.speech.pause" = "Pause speaking"; -"accessibility.speech.forward" = "Skip forward"; -"accessibility.speech.backward" = "Skip backward"; -"accessibility.speech.title" = "Read Aloud"; -"accessibility.show_reader" = "Reading Mode"; -"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; -"accessibility.show_speech" = "Read Aloud"; +"accessibility.speech.pause" = "Pausar la narración"; +"accessibility.speech.forward" = "Saltar hacia adelante"; +"accessibility.speech.backward" = "Retroceder"; +"accessibility.speech.title" = "Leer en voz alta"; +"accessibility.show_reader" = "Modo de lectura"; +"accessibility.show_reader_accessibility_label" = "Cambiar al modo lectura"; +"accessibility.show_speech" = "Leer en voz alta"; "accessibility.show_speech_accessibility_label" = "Empieza a leer en voz alta"; "accessibility.open_document_accessibility" = "Abrir opciones de accesibilidad"; diff --git a/Zotero/Assets/es.lproj/Localizable.strings b/Zotero/Assets/es.lproj/Localizable.strings index 9bea0ed3b..bd042577a 100644 --- a/Zotero/Assets/es.lproj/Localizable.strings +++ b/Zotero/Assets/es.lproj/Localizable.strings @@ -60,16 +60,16 @@ "close_without_saving" = "Cerrar sin guardar"; "stay" = "Permanecer"; -"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; -"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; -"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; +"migration_debug" = "La aplicación no se ha podido inicializar y no funciona correctamente. Por favor, informe del ID de depuración %@ en los foros de Zotero."; +"login_debug" = "La aplicación no ha podido iniciar sesión. Vuelva a iniciar sesión e informe del ID de depuración %@ en los foros de Zotero."; +"full_sync_debug" = "La sincronización completa ha finalizado. Por favor, informe del ID de depuración %@ en los foros de Zotero."; -"day_suffixes" = "st,nd,rd,th"; +"day_suffixes" = ".º"; "onboarding.access" = "Zotero organiza la investigación como usted desee. Clasifique sus elementos en colecciones y etiquételos con palabras clave."; -"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; -"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; -"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; +"onboarding.sync" = "Sincronizar y colaborar en todos los dispositivos, manteniendo sus lecturas y notas perfectamente actualizadas."; +"onboarding.annotate" = "Resalte y tome notas directamente en sus archivos PDF mientras los lee."; +"onboarding.share" = "Pulse para recopilar artículos y libros directamente desde la web, incluyendo sus archivos PDF y metadatos completos."; "onboarding.sign_in" = "Acceder"; "onboarding.create_account" = "Registrarse"; "login.username" = "Nombre de usuario"; @@ -80,7 +80,7 @@ "libraries.my_library" = "Mi biblioteca"; "libraries.group_libraries" = "Bibliotecas de grupo"; -"libraries.delete_question" = "Do you really want to delete “%@”?"; +"libraries.delete_question" = "¿De verdad quiere eliminar «%@»?"; "collections.search_title" = "Buscar colección"; "collections.all_items" = "Todos los elementos"; @@ -92,7 +92,7 @@ "collections.delete" = "Eliminar colección"; "collections.delete_with_items" = "Eliminar colección y elementos"; "collections.create_title" = "Crear colección"; -"collections.picker_title" = "Choose Parent"; +"collections.picker_title" = "Elegir principal"; "collections.empty_trash" = "Vaciar la papelera"; "collections.collapse_all" = "Contraer todo"; "collections.expand_all" = "Expandir todo"; @@ -107,34 +107,34 @@ "sync_toolbar.object" = "Sincronizando %@ en %@"; "sync_toolbar.object_with_data" = "Sincronizando %@ (%d / %d) en %@"; "sync_toolbar.finished" = "Sincronización completada"; -"sync_toolbar.deletion" = "Applying remote deletions in %@"; +"sync_toolbar.deletion" = "Aplicando eliminaciones remotas en %@"; "sync_toolbar.aborted" = "Error de sincronización (%@)"; -"sync_toolbar.writes" = "Uploading changes (%d / %d)"; -"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; +"sync_toolbar.writes" = "Subiendo cambios (%d / %d)"; +"sync_toolbar.uploads" = "Subiendo adjunto (%d / %d)"; "sync_toolbar.object.collections" = "colecciones"; "sync_toolbar.object.groups" = "grupos"; "sync_toolbar.object.items" = "elementos"; "sync_toolbar.object.searches" = "búsquedas"; -"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; +"sync.conflict_resolution.changed_item_deleted" = "El elemento «%@» se ha eliminado. ¿Desea conservar los cambios?"; "items.search_title" = "Buscar elementos"; "items.select_all" = "Seleccionar todo"; "items.deselect_all" = "Deseleccionar todo"; "items.sort_by" = "Ordenar por"; "items.sort_order" = "Orden de clasificación"; -"items.ascending" = "Ascending"; +"items.ascending" = "Ascendente"; "items.descending" = "Descendiendo"; "items.lookup" = "Añadir por identificador"; "items.barcode" = "Escanear código de barras"; "items.new" = "Añadir manualmente"; -"items.new_note" = "New Standalone Note"; +"items.new_note" = "Nueva nota independiente"; "items.new_file" = "Añadir archivo"; "items.remove_from_collection_title" = "Eliminar de la colección"; "items.action.add_to_collection" = "Añadir a la colección"; "items.action.remove_from_collection" = "Eliminar de la colección"; "items.action.duplicate" = "Duplicar"; -"items.action.create_parent" = "Create Parent Item"; +"items.action.create_parent" = "Crear elemento principal"; "items.action.download" = "Descargar"; "items.action.remove_download" = "Eliminar descarga"; "items.action.retrieve_metadata" = "Recuperar metadatos"; @@ -174,11 +174,11 @@ "citation.locator.verse" = "Verso"; "citation.style" = "Estilo"; "citation.language" = "Idioma"; -"citation.output_mode" = "Output Mode"; +"citation.output_mode" = "Modo de salida"; "citation.citations" = "Citas"; "citation.bibliography" = "Bibliografía"; "citation.notes" = "Notas"; -"citation.output_method" = "Output Method"; +"citation.output_method" = "Método de salida"; "citation.save_html" = "Guardar como HTML"; "citation.copy" = "Copiar a portapapeles"; @@ -199,39 +199,39 @@ "item_detail.delete_attachment_file" = "Eliminar descarga"; "item_detail.deleted_title" = "Eliminado"; "item_detail.deleted_message" = "Este elemento ha sido eliminado. ¿Desea restaurarlo?"; -"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; +"item_detail.move_to_standalone_attachment" = "Convertir a archivo adjunto independiente"; "tag_picker.title" = "%d seleccionado"; "tag_picker.placeholder" = "Nombre de etiqueta"; "tag_picker.create_tag" = "Crear etiqueta “%@”"; -"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; -"tag_picker.search_placeholder" = "Search Tags"; +"tag_picker.confirm_deletion_question" = "Eliminar etiquetas automáticas"; +"tag_picker.search_placeholder" = "Etiquetas de búsqueda"; "tag_picker.deselect_all" = "Deseleccionar todo"; -"tag_picker.show_auto" = "Show Automatic Tags"; -"tag_picker.show_all" = "Display All Tags in This Library"; -"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; +"tag_picker.show_auto" = "Mostrar etiquetas automáticas"; +"tag_picker.show_all" = "Mostrar todas las etiquetas de esta biblioteca"; +"tag_picker.delete_automatic" = "Eliminar etiquetas automáticas en esta biblioteca"; "creator_editor.creator" = "Tipo de creador"; "creator_editor.first_name" = "Nombre"; "creator_editor.last_name" = "Apellido"; "creator_editor.switch_to_single" = "Cambiar a un solo campo"; "creator_editor.switch_to_dual" = "Cambiar a dos campos"; -"creator_editor.delete_confirmation" = "¿De verdad quieres eliminar este creador?"; +"creator_editor.delete_confirmation" = "¿De verdad quiere eliminar este creador?"; "pdf.annotations_sidebar.search_title" = "Buscar"; -"pdf.annotations_sidebar.add_comment" = "Add comment"; +"pdf.annotations_sidebar.add_comment" = "Añadir comentario"; "pdf.annotations_sidebar.add_tags" = "Añadir etiquetas"; "pdf.annotations_sidebar.merge" = "Fusionar"; "pdf.annotations_sidebar.filter.title" = "Filtrar anotaciones"; "pdf.annotations_sidebar.filter.tags_placeholder" = "Seleccionar etiquetas..."; -"pdf.search.title" = "Search in Document"; +"pdf.search.title" = "Buscar en el documento"; "pdf.search.failed" = "La búsqueda no ha dado resultados"; -"pdf.search.dismiss" = "Dismiss Search"; +"pdf.search.dismiss" = "Descartar búsqueda"; "pdf.annotation_popover.title" = "Editar anotación"; "pdf.annotation_popover.delete" = "Eliminar anotación"; -"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; -"pdf.annotation_popover.page_label_title" = "Edit Page Number"; -"pdf.annotation_popover.no_comment" = "No comment"; +"pdf.annotation_popover.update_subsequent_pages" = "Actualizar páginas siguientes"; +"pdf.annotation_popover.page_label_title" = "Editar número de página"; +"pdf.annotation_popover.no_comment" = "Sin comentarios"; "pdf.annotation_popover.line_width" = "Ancho"; "pdf.annotation_popover.size" = "Tamaño"; "pdf.deleted_title" = "Eliminado"; @@ -240,27 +240,27 @@ "pdf.highlight" = "Destacar"; "pdf.underline" = "Subrayar"; "pdf.annotation_share.image.share" = "Compartir imagen"; -"pdf.annotation_share.image.medium" = "Medium"; +"pdf.annotation_share.image.medium" = "Medio"; "pdf.annotation_share.image.large" = "Grande"; "pdf.annotation_toolbar.eraser" = "Goma de borrar"; "pdf.annotation_toolbar.highlight" = "Destacar"; "pdf.annotation_toolbar.note" = "Nota"; -"pdf.annotation_toolbar.image" = "Image"; -"pdf.annotation_toolbar.ink" = "Ink"; +"pdf.annotation_toolbar.image" = "Imagen"; +"pdf.annotation_toolbar.ink" = "Tinta"; "pdf.annotation_toolbar.underline" = "Subrayar"; "pdf.annotation_toolbar.text" = "Texto"; "pdf.locked.locked" = "Bloqueado"; -"pdf.locked.enter_password" = "Please enter the password to open this PDF."; -"pdf.locked.failed" = "Incorrect password. Please try again."; -"pdf.settings.scroll_direction.title" = "Scroll Direction"; +"pdf.locked.enter_password" = "Introduzca la contraseña para abrir este PDF."; +"pdf.locked.failed" = "Contraseña incorrecta. Inténtalo de nuevo."; +"pdf.settings.scroll_direction.title" = "Dirección de desplazamiento"; "pdf.settings.scroll_direction.horizontal" = "Horizontal"; "pdf.settings.scroll_direction.vertical" = "Vertical"; "pdf.settings.page_transition.title" = "Transición de página"; "pdf.settings.page_transition.jump" = "Saltar"; "pdf.settings.page_transition.continuous" = "Continuo"; -"pdf.settings.appearance.title" = "Appearance"; +"pdf.settings.appearance.title" = "Apariencia"; "pdf.settings.appearance.auto" = "Automático"; -"pdf.settings.appearance.light_mode" = "Light"; +"pdf.settings.appearance.light_mode" = "Luz"; "pdf.settings.appearance.dark_mode" = "Oscuro"; "pdf.settings.appearance.sepia_mode" = "Sepia"; "pdf.settings.page_mode.title" = "Modo de página"; @@ -271,182 +271,182 @@ "pdf.settings.page_fitting.fit" = "Ajustar"; "pdf.settings.page_fitting.fill" = "Rellenar"; "pdf.settings.page_spreads.title" = "Páginas dobles"; -"pdf.settings.page_spreads.odd" = "Odd"; -"pdf.settings.page_spreads.even" = "Even"; +"pdf.settings.page_spreads.odd" = "Extraño"; +"pdf.settings.page_spreads.even" = "Incluso"; "pdf.settings.page_fitting.automatic" = "Automático"; "pdf.export.export" = "Exportar PDF"; "pdf.export.export_annotated" = "Exportar PDF anotado"; "pdf.sidebar.no_annotations" = "Sin anotaciones"; -"pdf.sidebar.no_outline" = "No Outline"; -"pdf.delete_annotation" = "Do you really want to delete this annotation?"; -"pdf.previous_page" = "Previous Page"; +"pdf.sidebar.no_outline" = "Sin esquema"; +"pdf.delete_annotation" = "¿De verdad quiere eliminar esta anotación?"; +"pdf.previous_page" = "Página anterior"; "pdf.next_page" = "Página siguiente"; -"pdf.previous_viewport" = "Previous Viewport"; -"pdf.next_viewport" = "Next Viewport"; +"pdf.previous_viewport" = "Ventana gráfica anterior"; +"pdf.next_viewport" = "Siguiente ventana gráfica"; "settings.title" = "Ajustes"; "settings.logout" = "Cerrar sesión"; -"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; +"settings.logout_warning" = "Se eliminarán todos los datos locales que no se hayan sincronizado. ¿De verdad quiere cerrar sesión?"; "settings.general.title" = "General"; -"settings.general.show_subcollections_title" = "Show Items from Subcollections"; -"settings.general.show_collection_item_counts" = "Show Collection Sizes"; -"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; -"settings.general.autoempty_title" = "Delete Items in Trash"; +"settings.general.show_subcollections_title" = "Mostrar elementos de subcolecciones"; +"settings.general.show_collection_item_counts" = "Mostrar tamaños de colección"; +"settings.general.open_links_in_external_browser" = "Abrir enlaces en un navegador externo"; +"settings.general.autoempty_title" = "Eliminar elementos de la papelera"; "settings.general.never" = "Nunca"; -"settings.item_count" = "Item count"; -"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.item_count" = "Recuento de elementos"; +"settings.item_count_subtitle" = "Mostrar el recuento de elementos de todas las colecciones."; "settings.sync.title" = "Cuenta"; "settings.sync.data_syncing" = "Sincronización de datos"; -"settings.sync.file_syncing" = "File Syncing"; -"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.file_syncing" = "Sincronización de archivos"; +"settings.sync.file_syncing_type_message" = "Sincronizar archivos adjuntos en Mi biblioteca utilizando"; "settings.sync.account" = "Cuenta"; -"settings.sync.manage_account" = "Manage Account"; +"settings.sync.manage_account" = "Gestionar cuenta"; "settings.sync.delete_account" = "Eliminar cuenta"; "settings.sync.username" = "Nombre de usuario"; "settings.sync.password" = "Contraseña"; "settings.sync.verify" = "Verificar servidor"; "settings.sync.directory_not_found.title" = "Directorio no encontrado"; -"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; +"settings.sync.directory_not_found.message" = "%@ no existe.\n\n¿Desea crearlo ahora?"; "settings.sync.verified" = "Verificado"; "settings.permission" = "Permiso de usuario"; -"settings.permission_subtitle" = "Ask for user permission for each write action"; +"settings.permission_subtitle" = "Solicitar permiso al usuario para cada acción de escritura"; "settings.translators" = "Traductores"; "settings.translators_update" = "Actualizar traductores"; "settings.translators_updating" = "Actualizando..."; -"settings.reset_to_bundled" = "Reset to bundled"; -"settings.debug" = "Debug Output Logging"; +"settings.reset_to_bundled" = "Restablecer a la configuración predeterminada"; +"settings.debug" = "Registro de salida de depuración"; "settings.logging_title" = "Iniciar sesión"; "settings.start_logging" = "Comenzar iniciar sesión"; "settings.start_logging_on_launch" = "Iniciar sesión en el próximo inicio de la aplicación"; "settings.cancel_logging" = "Cancelar iniciar sesión"; "settings.stop_logging" = "Parar iniciar sesión"; "settings.view_output" = "Ver salida"; -"settings.clear_output" = "Clear Output"; -"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; -"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; +"settings.clear_output" = "Borrar la salida"; +"settings.logging_desc1" = "Para solucionar un problema de inicio, fuerce el cierre de la aplicación y vuelva a iniciarla."; +"settings.logging_desc2" = "Para depurar un problema de extensión compartida, abra la extensión compartida."; "settings.send_manually" = "Enviar manualmente"; -"settings.log_alert.progress_title" = "Sending Logs"; -"settings.log_alert.title" = "Logs Sent"; -"settings.log_alert.message" = "Your Debug ID is %@"; -"settings.crash_alert.title" = "Crash Log Sent"; -"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; -"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; -"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; -"settings.crash_alert.export_db" = "Copy and Export Database"; +"settings.log_alert.progress_title" = "Envío de registros"; +"settings.log_alert.title" = "Registros enviados"; +"settings.log_alert.message" = "Su ID de depuración es %@"; +"settings.crash_alert.title" = "Registro de fallos enviado"; +"settings.crash_alert.message" = "Su ID de informe es %@.\n\nPor favor, publique un mensaje en los foros de Zotero (forums.zotero.org) con este ID de informe y los pasos necesarios para reproducir el fallo."; +"settings.crash_alert.message_with_db" = "Su ID de informe es %@.\n\nPor favor, publique un mensaje en los foros de Zotero (forums.zotero.org) con este ID de informe y los pasos necesarios para reproducir el fallo.\n\nSi Zotero falla repetidamente, pulse «Exportar base de datos» y envía los archivos exportados a support@zotero.org."; +"settings.crash_alert.submit_forum" = "Enviar a los foros de Zotero"; +"settings.crash_alert.export_db" = "Copiar y exportar base de datos"; "settings.crash_alert.copy" = "Copiar a portapapeles"; -"settings.websocket_title" = "Server Connection"; +"settings.websocket_title" = "Conexión al servidor"; "settings.websocket_connected" = "Conectado"; "settings.websocket_connecting" = "Conectando"; "settings.websocket_disconnected" = "Desconectado"; -"settings.websocket_disconnect" = "Disconnect from Server"; -"settings.websocket_connect" = "Connect to Server"; -"settings.storage" = "Local Storage"; -"settings.storage.delete_all" = "Delete All Local Attachment Files"; -"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; -"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; -"settings.saving.title" = "Saving"; +"settings.websocket_disconnect" = "Desconectar del servidor"; +"settings.websocket_connect" = "Conectarse al servidor"; +"settings.storage" = "Almacenamiento local"; +"settings.storage.delete_all" = "Eliminar todos los archivos adjuntos locales"; +"settings.storage.delete_all_question" = "¿Está seguro de que desea eliminar todos los archivos adjuntos de este dispositivo?\n\nLos demás dispositivos sincronizados no se verán afectados."; +"settings.storage.delete_library_question" = "¿Está seguro de que desea eliminar todos los archivos adjuntos en %@ de este dispositivo?\n\nLos demás dispositivos sincronizados no se verán afectados."; +"settings.saving.title" = "Guardando"; "settings.saving.files_title" = "Guardar archivos"; -"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; -"settings.saving.tags_title" = "Save Automatic Tags"; -"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; -"settings.cite.title" = "Cite"; -"settings.cite.styles_title" = "Citation Styles"; -"settings.cite.get_more_styles" = "Get additional styles"; -"settings.cite_search.search_title" = "Search styles"; +"settings.saving.files_message" = "Adjuntar automáticamente los archivos PDF y otros archivos asociados al guardar elementos"; +"settings.saving.tags_title" = "Guardar etiquetas automáticas"; +"settings.saving.tags_message" = "Etiqueta automáticamente los elementos con palabras clave y encabezados temáticos"; +"settings.cite.title" = "Citar"; +"settings.cite.styles_title" = "Estilos de citación"; +"settings.cite.get_more_styles" = "Obtenga estilos adicionales"; +"settings.cite_search.search_title" = "Estilos de búsqueda"; "settings.export.title" = "Copia rápida"; "settings.export.default_format" = "Formato predeterminado"; "settings.export.language" = "Idioma"; "settings.export.copy_as_html" = "Copiar como HTML"; -"settings.versionAndBuild" = "Version %@ Build %@"; -"settings.export_db" = "Export Database File"; -"settings.full_sync_debug" = "Advanced"; -"settings.full_sync.start" = "Start Full Sync Debugging"; -"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; -"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; +"settings.versionAndBuild" = "Versión %@ Compilación %@"; +"settings.export_db" = "Exportar archivo de base de datos"; +"settings.full_sync_debug" = "Avanzado"; +"settings.full_sync.start" = "Iniciar depuración de sincronización completa"; +"settings.full_sync.other_in_progress" = "Ya se está realizando una sincronización. Espere a que finalice."; +"settings.full_sync.in_progress" = "Se está realizando una sincronización completa. Espere a que finalice y publique el ID de depuración en los foros de Zotero."; "settings.annotation_tools" = "Herramientas de anotación"; "settings.annotation_tools.pdf" = "PDF"; "settings.annotation_tools.html_epub" = "HTML / EPUB"; "settings.annotation_tools.reset" = "Restablecer"; -"shareext.save" = "Save to Zotero"; -"shareext.decoding_attachment" = "Searching for items"; -"shareext.translation.item_selection" = "Choose an item"; -"shareext.translation.translating_with" = "Saving with %@"; +"shareext.save" = "Guardar en Zotero"; +"shareext.decoding_attachment" = "Búsqueda de elementos"; +"shareext.translation.item_selection" = "Elija un elemento"; +"shareext.translation.translating_with" = "Guardando con %@"; "shareext.loading_collections" = "Cargando colecciones"; -"shareext.sync_error" = "Unable to sync collections"; -"shareext.collection_other" = "More"; +"shareext.sync_error" = "No se pueden sincronizar las colecciones"; +"shareext.collection_other" = "Más"; "shareext.item_title" = "Elemento"; "shareext.collection_title" = "Colección"; "shareext.tags_title" = "Etiquetas"; "searchbar.placeholder" = "Buscar"; -"searchbar.accessibility_cancel" = "Cancel Search"; -"searchbar.accessibility_clear" = "Clear Search"; +"searchbar.accessibility_cancel" = "Cancelar búsqueda"; +"searchbar.accessibility_clear" = "Limpiar búsqueda"; -"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; -"errors.parsing" = "Could not parse some data. Other data will continue to sync."; -"errors.api" = "Failed API response: %@"; -"errors.db" = "Could not connect to database. The device storage might be full."; -"errors.versionMismatch" = "A remote change was made during the sync"; +"errors.schema" = "No se han podido descargar algunos datos de Mi biblioteca. Es posible que se hayan guardado con una versión más reciente de Zotero.\n\nEl resto de datos se seguirán sincronizando."; +"errors.parsing" = "No se han podido analizar algunos datos. El resto de datos se seguirán sincronizando."; +"errors.api" = "Respuesta API fallida: %@"; +"errors.db" = "No se pudo conectar a la base de datos. Es posible que el almacenamiento del dispositivo esté lleno."; +"errors.versionMismatch" = "Se realizó un cambio remoto durante la sincronización"; "errors.unknown" = "Error desconocido"; -"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; -"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; -"errors.attachments.cant_open_attachment" = "The attached file could not be found."; -"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; -"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; -"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; -"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; -"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; -"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; -"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; +"errors.attachments.cant_unzip_snapshot" = "No se puede descomprimir la instantánea"; +"errors.attachments.incompatible_attachment" = "Los archivos vinculados no son compatibles con dispositivos móviles. Puede abrirlos utilizando la aplicación de escritorio Zotero."; +"errors.attachments.cant_open_attachment" = "No se ha encontrado el archivo adjunto."; +"errors.attachments.missing_zotero" = "El archivo adjunto no está disponible en la biblioteca en línea."; +"errors.attachments.missing_webdav" = "El archivo adjunto no está disponible en el servidor WebDAV."; +"errors.attachments.missing_additional" = "Compruebe que el archivo se haya sincronizado en el dispositivo donde se añadió."; +"errors.attachments.unauthorized_webdav" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que ha guardado en los ajustes."; +"errors.attachments.too_many_requests_webdav" = "El servidor WebDAV está limitando sus solicitudes. Vuelva a intentarlo en unos minutos o compruebe sus credenciales de inicio de sesión."; +"errors.attachments.too_many_requests" = "Demasiadas solicitudes. Vuelva a intentarlo en unos minutos."; +"errors.attachments.forbidden_webdav" = "No tiene permiso para acceder a %@ en el servidor WebDAV."; "errors.attachments.generic_filename" = "el archivo"; "errors.login.invalid_password" = "Contraseña no válida"; "errors.login.invalid_username" = "Nombre de usuario no válido"; "errors.login.invalid_credentials" = "Nombre de usuario o contraseña no válidos"; -"errors.libraries.cantLoad" = "Unable to load libraries"; +"errors.libraries.cantLoad" = "No se pueden cargar las bibliotecas"; "errors.collections.empty_name" = "Introduzca un nombre para la colección"; "errors.collections.save_failed" = "No se puede guardar la colección"; "errors.collections.bibliography_failed" = "No se pudieron cargar los elementos para la bibliografía"; -"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; -"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; +"errors.sync.group_removed" = "El grupo \"%@\" ya no es accesible. ¿Qué desea hacer?"; +"errors.sync.metadata_write_denied" = "Ya no puede escribir al grupo \"%@\". ¿Qué quiere hacer?"; "errors.sync.revert_to_original" = "Volver al original"; -"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; -"errors.sync.reset_group_files" = "Reset Group Files and Sync"; +"errors.sync.file_write_denied" = "Ya no tiene acceso para editar archivos del grupo \"%@\", y los archivos que haya modificado localmente no se pueden cargar. Si continúa, todos los archivos del grupo se restablecerán a su estado en %@.\n\nSi desea copiar los archivos modificados en otra ubicación o solicitar acceso para editar archivos a un administrador del grupo, puede omitir la sincronización del grupo ahora."; +"errors.sync.reset_group_files" = "Restablecer archivos de grupo y sincronizar"; "errors.sync.skip_group" = "Saltar grupo"; "errors.sync_toolbar.finished_with_errors" = "Sincronización completada (%@)"; -"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; -"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; -"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; -"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; +"errors.sync_toolbar.attachment_missing" = "No se puede cargar el archivo adjunto: %@. Intente eliminar y volver a añadir el archivo adjunto."; +"errors.sync_toolbar.libraries_missing" = "No se han encontrado bibliotecas. Cierre la sesión y vuelva a iniciarla."; +"errors.sync_toolbar.groups_failed" = "No se pudieron sincronizar los grupos. Inténtelo de nuevo."; +"errors.sync_toolbar.conflict_retry_limit" = "Sincronización remota en curso. Vuelva a intentarlo en unos minutos."; "errors.sync_toolbar.group_permissions" = "No tienes permiso para editar grupos."; -"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; -"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; -"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; +"errors.sync_toolbar.internet_connection" = "No se puede conectar a la red. Inténtelo de nuevo."; +"errors.sync_toolbar.personal_quota_reached" = "Ha alcanzado su cuota de almacenamiento de Zotero. Algunos archivos no se han cargado. El resto de datos de Zotero seguirán sincronizándose.\n\nConsulte la configuración de su cuenta de zotero.org para ver opciones de almacenamiento adicionales."; +"errors.sync_toolbar.group_quota_reached" = "El grupo \"%@\" ha alcanzado su cuota de almacenamiento en Zotero. Algunos archivos no se han subido. El resto de datos de Zotero seguirán sincronizándose.\n\nEl propietario del grupo puede aumentar la capacidad de almacenamiento del grupo desde la configuración de almacenamiento en zotero.org."; +"errors.sync_toolbar.insufficient_space" = "No dispone de suficiente espacio en su servidor WebDAV. Algunos archivos no se han cargado. El resto de datos de Zotero seguirán sincronizándose."; "errors.sync_toolbar.quota_reached_short" = "Cuota alcanzada."; -"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; -"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; -"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; +"errors.sync_toolbar.unavailable" = "Los servicios de Zotero no están disponibles temporalmente. Vuelva a intentarlo en unos minutos."; +"errors.sync_toolbar.webdav_error" = "No se pudieron eliminar los archivos del servidor WebDAV: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Archivo prop no válido: %@"; "errors.sync_toolbar.show_item" = "Mostrar elemento"; "errors.sync_toolbar.show_items" = "Mostrar elementos"; "errors.sync_toolbar.forbidden" = "Nombre de usuario o contraseña no válidos"; -"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; -"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; -"errors.items.loading" = "Could not load items"; -"errors.items.deletion" = "Could not remove item"; -"errors.items.deletion_from_collection" = "Could not remove item from collection"; -"errors.items.add_to_collection" = "Could not add item to collection"; -"errors.items.move_item" = "Could not move item"; +"errors.sync_toolbar.forbidden_message" = "El servidor de sincronización de Zotero no ha aceptado su nombre de usuario y contraseña.\n\nCierre la sesión e inicie sesión con la información de inicio de sesión correcta."; +"errors.sync_toolbar.webdav_request_failed" = "Su servidor WebDAV devolvió un error HTTP %d para una solicitud %@."; +"errors.items.loading" = "No se pudieron cargar los elementos"; +"errors.items.deletion" = "No se pudo eliminar el elemento"; +"errors.items.deletion_from_collection" = "No se pudo eliminar el elemento de la colección"; +"errors.items.add_to_collection" = "No se pudo añadir el artículo a la colección"; +"errors.items.move_item" = "No se pudo mover el elemento"; "errors.items.save_note" = "No se pudo guardar la nota."; -"errors.items.add_attachment" = "Could not add attachment"; -"errors.items.add_some_attachments" = "Some attachments were not added: %@"; -"errors.items.load_duplication" = "Could not load item to duplicate"; -"errors.items.generating_bib" = "Could not generate bibliography"; -"errors.citation_preview" = "Could not generate citation preview"; -"errors.item_detail.dropped_fields_title" = "Change Item Type"; -"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; -"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; -"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; +"errors.items.add_attachment" = "No se pudo añadir el archivo adjunto"; +"errors.items.add_some_attachments" = "Algunos archivos adjuntos no se han añadido: %@"; +"errors.items.load_duplication" = "No se pudo cargar el elemento para duplicarlo"; +"errors.items.generating_bib" = "No se pudo generar la bibliografía"; +"errors.citation_preview" = "No se pudo generar la vista previa de la cita."; +"errors.item_detail.dropped_fields_title" = "Cambiar tipo de elemento"; +"errors.item_detail.dropped_fields_message" = "¿Está seguro de que desea cambiar el tipo de elemento?\n\nSe perderán los siguientes campos:\n\n%@"; +"errors.item_detail.cant_load_data" = "No se pudieron cargar los datos. Inténtelo de nuevo."; +"errors.item_detail.cant_create_attachments_with_names" = "No se pudieron crear los archivos adjuntos: %@"; "errors.item_detail.cant_create_attachments" = "No se pudieron crear los archivos adjuntos"; "errors.item_detail.cant_save_note" = "No se pudo guardar la nota"; "errors.item_detail.cant_save_changes" = "No se pudieron guardar los cambios"; @@ -454,7 +454,7 @@ "errors.item_detail.cant_save_tags" = "No se pudieron guardar las etiquetas"; "errors.item_detail.unsupported_type" = "El tipo \"%@\" no es compatible"; "errors.settings.storage" = "No se pudieron recopilar los datos de almacenamiento"; -"errors.settings.webdav.file_missing_after_upload" = "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."; +"errors.settings.webdav.file_missing_after_upload" = "Se ha detectado un posible problema con su servidor WebDAV.\n\nUn archivo cargado no estaba disponible inmediatamente para su descarga. Es posible que se produzca un breve retraso entre el momento en que se cargan los archivos y el momento en que están disponibles, especialmente si utiliza un servicio de almacenamiento en la nube.\n\nSi la sincronización de archivos de Zotero parece funcionar con normalidad, puede ignorar este mensaje. Si tiene algún problema, publique un mensaje en los foros de Zotero."; "errors.settings.webdav.invalid_url" = "Error de verificación de WebDAV"; "errors.settings.webdav.no_password" = "Error de verificación de WebDAV"; "errors.settings.webdav.no_url" = "Error de verificación de WebDAV"; @@ -465,54 +465,54 @@ "errors.settings.webdav.zotero_dir_not_found" = "Error de verificación de WebDAV"; "errors.settings.webdav.unauthorized" = "El servidor WebDAV no aceptó el nombre de usuario y la contraseña que introdujo."; "errors.settings.webdav.forbidden" = "No tiene permiso para acceder a la carpeta especificada en el servidor WebDAV."; -"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; -"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; -"errors.shareext.logged_out" = "Please log into the app before using this extension."; -"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; -"errors.shareext.unknown" = "An unknown error occurred."; -"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; -"errors.shareext.download_failed" = "Could not download file"; -"errors.shareext.items_not_found" = "No items found on page"; -"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; +"errors.settings.webdav.internet_connection" = "No se puede conectar a la red. Inténtelo de nuevo."; +"errors.settings.webdav.host_not_found" = "No se pudo conectar al servidor WebDAV"; +"errors.settings.webdav.ats" = "Debido a las restricciones de iOS, debe utilizar HTTPS para conectarse a un servidor WebDAV no local."; +"errors.shareext.logged_out" = "Inicie sesión en la aplicación antes de utilizar esta extensión."; +"errors.shareext.cant_load_data" = "No se han podido cargar los datos. Inténtelo de nuevo."; +"errors.shareext.unknown" = "Se ha producido un error desconocido."; +"errors.shareext.cant_load_schema" = "Se ha producido un error. Abra la aplicación Zotero, sincronícela e inténtelo de nuevo."; +"errors.shareext.download_failed" = "No se pudo descargar el archivo."; +"errors.shareext.items_not_found" = "No se han encontrado elementos en la página"; +"errors.shareext.schema_error" = "No se han podido descargar algunos datos. Es posible que se hayan guardado con una versión más reciente de Zotero."; "errors.shareext.translation_failed" = "Error al guardar"; -"errors.shareext.response_missing_data" = "An error occurred. Please try again."; -"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; -"errors.shareext.file_not_pdf" = "Unable to save PDF"; -"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; -"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; -"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; -"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; -"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; +"errors.shareext.response_missing_data" = "Se ha producido un error. Inténtelo de nuevo."; +"errors.shareext.failed_additional" = "Aún puede guardar esta página como un elemento de página web."; +"errors.shareext.file_not_pdf" = "No se puede guardar el PDF"; +"errors.shareext.api_error" = "Error al cargar el elemento. El elemento se guardó en su biblioteca local."; +"errors.shareext.webdav_error" = "Error al cargar el archivo adjunto al servidor WebDAV"; +"errors.shareext.personal_quota_reached" = "Ha alcanzado su cuota de almacenamiento de Zotero y no se ha podido cargar el archivo. Consulte la configuración de su cuenta para ver opciones de almacenamiento adicionales.\n\nEl archivo se ha guardado en su biblioteca local."; +"errors.shareext.group_quota_reached" = "El grupo \"%@\" ha alcanzado su cuota de almacenamiento en Zotero y no se ha podido cargar el archivo. El propietario del grupo puede consultar la configuración de su cuenta para obtener opciones de almacenamiento adicionales.\n\nEl archivo se ha guardado en la biblioteca local."; +"errors.shareext.forbidden" = "No tiene los permisos necesarios para añadir este elemento a %@."; "errors.shareext.webdav_not_verified" = "Error de verificación de WebDAV"; -"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; -"errors.db_failure" = "Error creating database. Please try logging in again."; +"errors.shareext.requires_browser" = "Este contenido debe cargarse en un navegador para poder compartirlo con Zotero. Ábralo en su navegador y utilice el botón Compartir del navegador."; +"errors.db_failure" = "Error al crear la base de datos. Intente iniciar sesión de nuevo."; "errors.logging.title" = "Error de depuración"; -"errors.logging.start" = "Unable to start debug logging"; -"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; -"errors.logging.upload" = "Could not upload logs. Please try again."; -"errors.logging.response_parsing" = "Unexpected response from server"; -"errors.translators.bundle_loading" = "Could not update translators. Try again?"; -"errors.styles.addition" = "Could not add style “%@”"; -"errors.styles.deletion" = "Could not delete style “%@”"; -"errors.styles.loading" = "Could not load styles"; -"errors.styles_search.loading" = "Could not load styles. Try again?"; -"errors.citation.generate_citation" = "Could not generate citation"; -"errors.citation.generate_bibliography" = "Could not generate bibliography"; -"errors.citation.invalid_types" = "Invalid item types selected"; -"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; +"errors.logging.start" = "No se puede iniciar el registro de depuración"; +"errors.logging.no_logs_recorded" = "No se produjo ninguna salida de depuración durante el registro"; +"errors.logging.upload" = "No se pudieron cargar los registros. Inténtelo de nuevo."; +"errors.logging.response_parsing" = "Respuesta inesperada del servidor"; +"errors.translators.bundle_loading" = "No se han podido actualizar los traductores. ¿Desea volver a intentarlo?"; +"errors.styles.addition" = "No se pudo añadir el estilo «%@»"; +"errors.styles.deletion" = "No se pudo eliminar el estilo «%@»"; +"errors.styles.loading" = "No se pudieron cargar los estilos"; +"errors.styles_search.loading" = "No se pudieron cargar los estilos. ¿Desea volver a intentarlo?"; +"errors.citation.generate_citation" = "No se pudo generar la cita"; +"errors.citation.generate_bibliography" = "No se pudo generar la bibliografía"; +"errors.citation.invalid_types" = "Tipos de elementos no válidos seleccionados"; +"errors.citation.missing_style" = "No se ha seleccionado ningún estilo de cita. Vaya a Ajustes → Copia rápida y seleccione un nuevo estilo."; "errors.citation.open_settings" = "Abrir ajustes"; -"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; -"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; -"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; -"errors.pdf.merge_too_big" = "The combined annotation would be too large."; -"errors.pdf.cant_update_annotation" = "Can’t update annotation"; -"errors.pdf.cant_add_annotations" = "Can’t add annotations"; -"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; -"errors.pdf.incompatible_document" = "This document is not supported."; -"errors.pdf.empty_document" = "This document is empty."; -"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; -"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero no ha podido encontrar ningún identificador en tu entrada. Compruebe su entrada e inténtelo de nuevo."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero no ha podido encontrar ningún identificador nuevo en tu entrada, o ya se han añadido. Compruebe tu entrada e inténtelo de nuevo."; +"errors.pdf.merge_too_big_title" = "No se pueden combinar las anotaciones"; +"errors.pdf.merge_too_big" = "La anotación combinada sería demasiado grande."; +"errors.pdf.cant_update_annotation" = "No se puede actualizar la anotación"; +"errors.pdf.cant_add_annotations" = "No se pueden añadir anotaciones"; +"errors.pdf.cant_delete_annotations" = "No se pueden eliminar las anotaciones"; +"errors.pdf.incompatible_document" = "Este documento no es compatible"; +"errors.pdf.empty_document" = "Este documento está vacío."; +"errors.pdf.page_index_not_int" = "Formato incorrecto de la página almacenada para este documento"; +"errors.pdf.document_changed" = "Este documento ha sido modificado en otro dispositivo. Vuelva a abrirlo para continuar editándolo."; "accessibility.untitled" = "Título"; "accessibility.locked" = "Bloqueado"; @@ -536,11 +536,11 @@ "accessibility.items.restore" = "Restaurar elementos seleccionados"; "accessibility.items.duplicate" = "Duplicar elemento seleccionado"; "accessibility.items.share" = "Compartir elementos seleccionados"; -"accessibility.items.download_attachments" = "Download attachments for selected items"; -"accessibility.items.remove_downloads" = "Remove downloads for selected items"; +"accessibility.items.download_attachments" = "Descargar archivos adjuntos para los elementos seleccionados"; +"accessibility.items.remove_downloads" = "Eliminar descargas de los elementos seleccionados"; "accessibility.items.collection" = "Colección"; -"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; -"accessibility.item_detail.open" = "Double-tap to open"; +"accessibility.item_detail.download_and_open" = "Pulse dos veces para descargar y abrir"; +"accessibility.item_detail.open" = "Pulse dos veces para abrir"; "accessibility.pdf.sidebar_open" = "Abrir barra lateral"; "accessibility.pdf.sidebar_close" = "Cerrar barra lateral"; "accessibility.pdf.share" = "Compartir PDF"; @@ -555,23 +555,23 @@ "accessibility.pdf.underline_annotation_tool" = "Crear anotación de subrayado"; "accessibility.pdf.text_annotation_tool" = "Crear anotación de texto"; "accessibility.pdf.eraser_annotation_tool" = "Goma de borrar"; -"accessibility.pdf.highlight_annotation" = "Highlight annotation"; -"accessibility.pdf.note_annotation" = "Note annotation"; -"accessibility.pdf.image_annotation" = "Image annotation"; -"accessibility.pdf.ink_annotation" = "Ink annotation"; -"accessibility.pdf.underline_annotation" = "Underline annotation"; -"accessibility.pdf.text_annotation" = "Text annotation"; +"accessibility.pdf.highlight_annotation" = "Resaltar anotación"; +"accessibility.pdf.note_annotation" = "Anotación de nota"; +"accessibility.pdf.image_annotation" = "Anotación de imágenes"; +"accessibility.pdf.ink_annotation" = "Anotación en tinta"; +"accessibility.pdf.underline_annotation" = "Subrayar anotación"; +"accessibility.pdf.text_annotation" = "Anotación de texto"; "accessibility.pdf.edit_annotation" = "Editar anotación"; "accessibility.pdf.share_annotation" = "Compartir anotación"; -"accessibility.pdf.share_annotation_image" = "Share annotation image"; +"accessibility.pdf.share_annotation_image" = "Compartir imagen de anotación"; "accessibility.pdf.eraser_annotation" = "Goma de borrar"; -"accessibility.pdf.highlighted_text" = "Highlighted text"; -"accessibility.pdf.underlined_text" = "Underlined text"; +"accessibility.pdf.highlighted_text" = "Texto resaltado"; +"accessibility.pdf.underlined_text" = "Texto subrayado"; "accessibility.pdf.author" = "Autor"; "accessibility.pdf.comment" = "Comentario"; "accessibility.pdf.tags" = "Etiquetas"; -"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; -"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; +"accessibility.pdf.annotation_hint" = "Pulse dos veces para seleccionar y editar."; +"accessibility.pdf.tags_hint" = "Pulse dos veces para editar las etiquetas"; "accessibility.pdf.selected" = "Seleccionados"; "accessibility.pdf.search_pdf" = "Buscar PDF"; "accessibility.pdf.redo" = "Rehacer"; @@ -581,12 +581,12 @@ "accessibility.htmlepub.search_html" = "Buscar sitio web"; "accessibility.htmlepub.search_epub" = "Buscar EPUB"; "accessibility.speech.play" = "Empieza a hablar"; -"accessibility.speech.pause" = "Pause speaking"; -"accessibility.speech.forward" = "Skip forward"; -"accessibility.speech.backward" = "Skip backward"; -"accessibility.speech.title" = "Read Aloud"; -"accessibility.show_reader" = "Reading Mode"; -"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; -"accessibility.show_speech" = "Read Aloud"; -"accessibility.show_speech_accessibility_label" = "Empieza a leer en voz alta"; +"accessibility.speech.pause" = "Pausar la narración"; +"accessibility.speech.forward" = "Saltar hacia adelante"; +"accessibility.speech.backward" = "Retroceder"; +"accessibility.speech.title" = "Leer en voz alta"; +"accessibility.show_reader" = "Modo de lectura"; +"accessibility.show_reader_accessibility_label" = "Cambiar al modo lectura"; +"accessibility.show_speech" = "Leer en voz alta"; +"accessibility.show_speech_accessibility_label" = "Empezar a leer en voz alta"; "accessibility.open_document_accessibility" = "Abrir opciones de accesibilidad"; diff --git a/Zotero/Assets/fi.lproj/Localizable.stringsdict b/Zotero/Assets/fi.lproj/Localizable.stringsdict index eb2a525b7..ed68e6aeb 100644 --- a/Zotero/Assets/fi.lproj/Localizable.stringsdict +++ b/Zotero/Assets/fi.lproj/Localizable.stringsdict @@ -5,16 +5,49 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 kokoelma valittu + other + %d kokoelmaa valittu + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Haluatko varmasti poistaa valitun nimikkeen? + other + Haluatko varmasti poistaa valitut nimikkeet? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Haluatko varmasti poistaa valitun nimikkeen tästä kokoelmasta? + other + Haluatko varmasti poistaa valitut nimikkeet tästä kokoelmasta? + items.toolbar_filter @@ -25,6 +58,17 @@ NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 hakuosuma löydetty + other + %d hakuosumaa löydetty + settings.storage.files_size_and_unit @@ -35,11 +79,33 @@ NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 ongelma + other + %d ongelmaa + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 avainsana valittu + other + %d avainsanaa valittu + tag_picker.confirm_deletion diff --git a/Zotero/Assets/fr.lproj/Localizable.strings b/Zotero/Assets/fr.lproj/Localizable.strings index 904bd4d87..cf8f0ab57 100644 --- a/Zotero/Assets/fr.lproj/Localizable.strings +++ b/Zotero/Assets/fr.lproj/Localizable.strings @@ -76,11 +76,11 @@ "login.password" = "Mot de passe"; "login.email" = "Courriel"; "login.repeat_password" = "Répéter le mot de passe"; -"login.forgot_password" = "Mot de passe oublié?"; +"login.forgot_password" = "Mot de passe oublié ?"; "libraries.my_library" = "Ma bibliothèque"; "libraries.group_libraries" = "Bibliothèques de groupe"; -"libraries.delete_question" = "Voulez-vous vraiment supprimer “%@”?"; +"libraries.delete_question" = "Voulez-vous vraiment supprimer “%@” ?"; "collections.search_title" = "Trouver la collection"; "collections.all_items" = "Tous les documents"; @@ -116,7 +116,7 @@ "sync_toolbar.object.items" = "documents"; "sync_toolbar.object.searches" = "recherches"; -"sync.conflict_resolution.changed_item_deleted" = "Le document “%@” a été supprimé. Voulez-vous conserver vos modifications ?"; +"sync.conflict_resolution.changed_item_deleted" = "Le document “%@” a été supprimé. Voulez-vous conserver vos modifications ?"; "items.search_title" = "Rechercher dans les documents"; "items.select_all" = "Tout sélectionner"; @@ -148,7 +148,7 @@ "items.creator_summary.etal" = "%@ et al."; "items.retrieving_metadata" = "Récupération des métadonnées"; -"lookup.title" = "Entrer des ISBN, DOI, PMID, arXiv ID ou bibcodes ADS à ajouter à votre bibliothèque:"; +"lookup.title" = "Entrer des ISBN, DOI, PMID, arXiv ID ou bibcodes ADS à ajouter à votre bibliothèque :"; "citation.title" = "Aperçu de la citation"; "citation.copy_citation" = "Copier la citation"; @@ -198,7 +198,7 @@ "item_detail.data_reloaded" = "Ce document a été modifié à distance. Il va maintenant se recharger."; "item_detail.delete_attachment_file" = "Supprimer le téléchargement"; "item_detail.deleted_title" = "Supprimé"; -"item_detail.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; +"item_detail.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; "item_detail.move_to_standalone_attachment" = "Convertir en pièce jointe indépendante"; "tag_picker.title" = "%d sélectionné"; @@ -216,7 +216,7 @@ "creator_editor.last_name" = "Nom"; "creator_editor.switch_to_single" = " Afficher un champ unique"; "creator_editor.switch_to_dual" = "Afficher deux champs"; -"creator_editor.delete_confirmation" = "Voulez-vous vraiment supprimer ce créateur ?"; +"creator_editor.delete_confirmation" = "Voulez-vous vraiment supprimer ce créateur ?"; "pdf.annotations_sidebar.search_title" = "Rechercher"; "pdf.annotations_sidebar.add_comment" = "Ajouter un commentaire"; @@ -235,7 +235,7 @@ "pdf.annotation_popover.line_width" = "Largeur"; "pdf.annotation_popover.size" = "Taille"; "pdf.deleted_title" = "Supprimé"; -"pdf.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; +"pdf.deleted_message" = "Ce document a été supprimé. Voulez-vous le restaurer ?"; "pdf.line_width_point" = "%0.1f pt"; "pdf.highlight" = "Surligner"; "pdf.underline" = "Souligner"; @@ -278,7 +278,7 @@ "pdf.export.export_annotated" = "Exporter le fichier PDF annoté"; "pdf.sidebar.no_annotations" = "Pas d'annotations"; "pdf.sidebar.no_outline" = "Pas de table des matières"; -"pdf.delete_annotation" = "Voulez-vous vraiment supprimer cette annotation ?"; +"pdf.delete_annotation" = "Voulez-vous vraiment supprimer cette annotation ?"; "pdf.previous_page" = "Page précédente"; "pdf.next_page" = "Page suivante"; "pdf.previous_viewport" = "Viewport précédent"; @@ -286,7 +286,7 @@ "settings.title" = "Paramètres"; "settings.logout" = "Se déconnecter"; -"settings.logout_warning" = "Toutes les données locales qui n'ont pas été synchronisées seront supprimées. Voulez-vous vraiment vous déconnecter ?"; +"settings.logout_warning" = "Toutes les données locales qui n'ont pas été synchronisées seront supprimées. Voulez-vous vraiment vous déconnecter ?"; "settings.general.title" = "Général"; "settings.general.show_subcollections_title" = "Afficher les documents des sous-collections"; "settings.general.show_collection_item_counts" = "Afficher la taille des collections"; @@ -306,7 +306,7 @@ "settings.sync.password" = "Mot de passe"; "settings.sync.verify" = "Vérifier le serveur"; "settings.sync.directory_not_found.title" = "Répertoire non trouvé"; -"settings.sync.directory_not_found.message" = "%@ n'existe pas.Voulez-vous le créer maintenant ?"; +"settings.sync.directory_not_found.message" = "%@ n'existe pas.\n\nVoulez-vous le créer maintenant ?"; "settings.sync.verified" = "Vérifié"; "settings.permission" = "Autorisation de l'utilisateur"; "settings.permission_subtitle" = "Demander l'autorisation de l'utilisateur pour chaque action d'écriture"; @@ -329,8 +329,8 @@ "settings.log_alert.title" = "Journaux envoyés"; "settings.log_alert.message" = "Votre Debug ID est %@"; "settings.crash_alert.title" = "Journal des plantages envoyé"; -"settings.crash_alert.message" = "Votre Report ID est %@. Veuillez poster un message sur les Forums Zotero (forums.zotero.org) avec ce Report ID et toutes les étapes nécessaires pour reproduire le plantage."; -"settings.crash_alert.message_with_db" = "Votre Report ID est %@.Veuillez publier un message sur les forums Zotero (forums.zotero.org) en indiquant ce Report ID et toutes les étapes nécessaires pour reproduire le plantage.Si Zotero plante de manière répétée, veuillez appuyer sur « Exporter la base de données » et envoyer les fichiers exportés à support@zotero.org."; +"settings.crash_alert.message" = "Votre Report ID est %@.\n\nVeuillez poster un message sur les Forums Zotero (forums.zotero.org) avec ce Report ID et toutes les étapes nécessaires pour reproduire le plantage."; +"settings.crash_alert.message_with_db" = "Votre Report ID est %@.\n\nVeuillez publier un message sur les forums Zotero (forums.zotero.org) en indiquant ce Report ID et toutes les étapes nécessaires pour reproduire le plantage.\n\nSi Zotero plante de manière répétée, veuillez appuyer sur « Exporter la base de données » et envoyer les fichiers exportés à support@zotero.org."; "settings.crash_alert.submit_forum" = "Envoyer sur les forums Zotero"; "settings.crash_alert.export_db" = "Copier et exporter la base de données"; "settings.crash_alert.copy" = "Copier dans le presse-papiers"; @@ -342,8 +342,8 @@ "settings.websocket_connect" = "Connecter au serveur"; "settings.storage" = "Stockage local"; "settings.storage.delete_all" = "Supprimer tous les fichiers joints locaux"; -"settings.storage.delete_all_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints ?"; -"settings.storage.delete_library_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints ?Les autres appareils synchronisés ne seront pas affectés."; +"settings.storage.delete_all_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints ?\n\nLes autres appareils synchronisés ne seront pas affectés."; +"settings.storage.delete_library_question" = "Voulez-vous vraiment supprimer de cet appareil tous les fichiers joints dans %@ ?\n\nLes autres appareils synchronisés ne seront pas affectés."; "settings.saving.title" = "Enregistrement en cours"; "settings.saving.files_title" = "Enregistrer les fichiers"; "settings.saving.files_message" = "Joindre automatiquement les fichiers PDF et les autres fichiers associés lors de l'enregistrement des documents"; @@ -383,9 +383,9 @@ "searchbar.accessibility_cancel" = "Annuler la recherche"; "searchbar.accessibility_clear" = "Effacer la recherche"; -"errors.schema" = "Certaines données de Ma bibliothèque n'ont pas pu être téléchargées. Elles ont peut-être été enregistrées avec une version plus récente de Zotero. Les autres données continueront à se synchroniser."; +"errors.schema" = "Certaines données de Ma bibliothèque n'ont pas pu être téléchargées. Elles ont peut-être été enregistrées avec une version plus récente de Zotero.\n\nLes autres données continueront à se synchroniser."; "errors.parsing" = "Impossible d'interpréter certaines données. La synchronisation des autres données va continuer."; -"errors.api" = "Échec de la réponse API : %@"; +"errors.api" = "Échec de la réponse API : %@"; "errors.db" = "Impossible de se connecter à la base de données. Le stockage de l'appareil est peut-être plein."; "errors.versionMismatch" = "Une modification à distance a été effectuée pendant la synchronisation."; "errors.unknown" = "Erreur inconnue"; @@ -407,30 +407,30 @@ "errors.collections.empty_name" = "Veuillez saisir un nom de collection"; "errors.collections.save_failed" = "Impossible d'enregistrer la collection"; "errors.collections.bibliography_failed" = "Impossible de charger les documents pour la bibliographie"; -"errors.sync.group_removed" = "Le groupe “%@” n'est plus accessible. Que voulez-vous faire ?"; -"errors.sync.metadata_write_denied" = "Vous n'avez plus les droits d'écriture pour le groupe “%@”. Que voulez-vous faire ?"; +"errors.sync.group_removed" = "Le groupe “%@” n'est plus accessible. Que voulez-vous faire ?"; +"errors.sync.metadata_write_denied" = "Vous n'avez plus les droits d'écriture pour le groupe “%@”. Que voulez-vous faire ?"; "errors.sync.revert_to_original" = "Revenir à l'original"; -"errors.sync.file_write_denied" = "Vous n'avez plus d'accès en écriture au groupe “%@”, et les fichiers que vous avez modifiés localement ne peuvent pas être mis en ligne. Si vous continuez, l'état de tous les fichiers du groupe sera réinitialisé à celui sur %@. Si vous souhaitez avoir une chance de copier vos modifications ailleurs ou de demander le droit d'accès en écriture à un administrateur du groupe, vous pouvez passer la synchronisation du groupe maintenant.."; +"errors.sync.file_write_denied" = "Vous n'avez plus d'accès en écriture au groupe “%@”, et les fichiers que vous avez modifiés localement ne peuvent pas être mis en ligne. Si vous continuez, l'état de tous les fichiers du groupe sera réinitialisé à celui sur %@.\n\nSi vous souhaitez avoir une chance de copier vos modifications ailleurs ou de demander le droit d'accès en écriture à un administrateur du groupe, vous pouvez passer la synchronisation du groupe maintenant.."; "errors.sync.reset_group_files" = "Réinitialiser les fichier des groupes et synchroniser"; "errors.sync.skip_group" = "Passer le groupe"; "errors.sync_toolbar.finished_with_errors" = "Synchronisation terminée (%@)"; -"errors.sync_toolbar.attachment_missing" = "Impossible de télécharger la pièce jointe : %@. Veuillez essayer de supprimer et d'ajouter à nouveau la pièce jointe."; +"errors.sync_toolbar.attachment_missing" = "Impossible de télécharger la pièce jointe : %@. Veuillez essayer de supprimer et d'ajouter à nouveau la pièce jointe."; "errors.sync_toolbar.libraries_missing" = "Aucune bibliothèque trouvée. Veuillez vous déconnecter puis vous reconnecter."; "errors.sync_toolbar.groups_failed" = "Impossible de synchroniser les groupes. Veuillez essayer à nouveau."; "errors.sync_toolbar.conflict_retry_limit" = "Synchronisation à distance en cours. Veuillez essayer à nouveau dans quelques minutes."; "errors.sync_toolbar.group_permissions" = "Vous n'avez pas l'autorisation de modifier les groupes."; "errors.sync_toolbar.internet_connection" = "Impossible de se connecter au réseau. Veuillez essayer à nouveau."; -"errors.sync_toolbar.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.Consultez les paramètres de votre compte zotero.org pour connaître les options de stockage supplémentaire."; -"errors.sync_toolbar.group_quota_reached" = "Le groupe \"%@\" a atteint son quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.Le propriétaire du groupe peut augmenter la capacité de stockage du groupe à partir des ses paramètres de stockage sur zotero.org."; +"errors.sync_toolbar.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.\n\nConsultez les paramètres de votre compte zotero.org pour connaître les options de stockage supplémentaire."; +"errors.sync_toolbar.group_quota_reached" = "Le groupe \"%@\" a atteint son quota de stockage Zotero. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à être synchronisées.\n\nLe propriétaire du groupe peut augmenter la capacité de stockage du groupe à partir des ses paramètres de stockage sur zotero.org."; "errors.sync_toolbar.insufficient_space" = "Vous ne disposez pas de suffisamment d'espace sur votre serveur WebDAV. Certains fichiers n'ont pas été téléchargés. Les autres données Zotero continueront à se synchroniser."; "errors.sync_toolbar.quota_reached_short" = "Quota atteint."; "errors.sync_toolbar.unavailable" = "Les services Zotero sont momentanément indisponibles. Veuillez réessayer dans quelques minutes."; -"errors.sync_toolbar.webdav_error" = "Impossible de supprimer les fichiers de votre serveur WebDAV : \"%@\"."; -"errors.sync_toolbar.webdav_item_prop" = "Fichier prop invalide : %@"; +"errors.sync_toolbar.webdav_error" = "Impossible de supprimer les fichiers de votre serveur WebDAV : \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "Fichier prop invalide : %@"; "errors.sync_toolbar.show_item" = "Afficher le document"; "errors.sync_toolbar.show_items" = "Afficher les documents"; "errors.sync_toolbar.forbidden" = "Utilisateur ou mot de passe invalide"; -"errors.sync_toolbar.forbidden_message" = "Le serveur de synchronisation Zotero n'a pas accepté votre nom d'utilisateur et votre mot de passe.Veuillez vous déconnecter et vous connecter avec des identifiants corrects."; +"errors.sync_toolbar.forbidden_message" = "Le serveur de synchronisation Zotero n'a pas accepté votre nom d'utilisateur et votre mot de passe.\n\nVeuillez vous déconnecter et vous connecter avec des identifiants corrects."; "errors.sync_toolbar.webdav_request_failed" = "Votre serveur WebDAV a renvoyé une erreur HTTP %d pour une requête %@."; "errors.items.loading" = "Impossible de charger les documents"; "errors.items.deletion" = "Impossible de supprimer le document"; @@ -439,14 +439,14 @@ "errors.items.move_item" = "Impossible de déplacer le document"; "errors.items.save_note" = "Impossible d'enregistrer la note"; "errors.items.add_attachment" = "Impossible d'ajouter la pièce jointe"; -"errors.items.add_some_attachments" = "Certaines pièces jointes n'ont pas été ajoutées : %@"; +"errors.items.add_some_attachments" = "Certaines pièces jointes n'ont pas été ajoutées : %@"; "errors.items.load_duplication" = "Impossible de charger le document à dupliquer"; "errors.items.generating_bib" = "Impossible de générer la bibliographie"; "errors.citation_preview" = "Impossible de générer l'aperçu de la citation"; "errors.item_detail.dropped_fields_title" = "Changer le type de document"; -"errors.item_detail.dropped_fields_message" = "Êtes-vous sûr de vouloir modifier le type du document?Les champs suivants seront perdus :%@"; +"errors.item_detail.dropped_fields_message" = "Êtes-vous sûr de vouloir modifier le type du document ?\n\nLes champs suivants seront perdus :\n\n%@"; "errors.item_detail.cant_load_data" = "Impossible de charger les données. Veuillez essayer à nouveau."; -"errors.item_detail.cant_create_attachments_with_names" = "Impossible de créer les pièces jointes : %@"; +"errors.item_detail.cant_create_attachments_with_names" = "Impossible de créer les pièces jointes : %@"; "errors.item_detail.cant_create_attachments" = "Impossible de créer les pièces jointes"; "errors.item_detail.cant_save_note" = "Impossible d'enregistrer la note"; "errors.item_detail.cant_save_changes" = "Impossible d'enregistrer les modifications"; @@ -454,7 +454,7 @@ "errors.item_detail.cant_save_tags" = "Impossible d'enregistrer les marqeurs"; "errors.item_detail.unsupported_type" = "Type \"%@\" non pris en charge"; "errors.settings.storage" = "Impossible de collecter les données de stockage"; -"errors.settings.webdav.file_missing_after_upload" = "Un problème potentiel a été détecté avec votre serveur WebDAV.Un fichier en ligne n'était pas immédiatement disponible au téléchargement. Il peut y avoir un léger délai entre le moment où vous mettez en ligne des fichiers et celui où ils deviennent disponibles, en particulier si vous utilisez un service de stockage en nuage.Si la synchronisation des fichiers Zotero semble fonctionner normalement, vous pouvez ignorer ce message. Si vous rencontrez des difficultés, veuillez publier un message sur les forums Zotero."; +"errors.settings.webdav.file_missing_after_upload" = "Un problème potentiel a été détecté avec votre serveur WebDAV.\n\nUn fichier en ligne n'était pas immédiatement disponible au téléchargement. Il peut y avoir un léger délai entre le moment où vous mettez en ligne des fichiers et celui où ils deviennent disponibles, en particulier si vous utilisez un service de stockage en nuage.\n\nSi la synchronisation des fichiers Zotero semble fonctionner normalement, vous pouvez ignorer ce message. Si vous rencontrez des difficultés, veuillez publier un message sur les forums Zotero."; "errors.settings.webdav.invalid_url" = "Erreur de vérification WebDAV"; "errors.settings.webdav.no_password" = "Erreur de vérification WebDAV"; "errors.settings.webdav.no_url" = "Erreur de vérification WebDAV"; @@ -481,8 +481,8 @@ "errors.shareext.file_not_pdf" = "Impossible d'enregistrer le fichier PDF"; "errors.shareext.api_error" = "Erreur de mise en ligne du document. Le document a été enregisté dans votre bibliothèque locale."; "errors.shareext.webdav_error" = "Erreur lors du téléchargement de la pièce jointe vers le serveur WebDAV"; -"errors.shareext.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Consultez les paramètres de votre compte pour connaître les options de stockage supplémentaire. Le fichier a été enregistré dans votre bibliothèque locale."; -"errors.shareext.group_quota_reached" = "Le groupe “%@” a atteint son quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Le propriétaire du groupe peut trouver des options de stockage supplémentaires dans les paramètres de son compte.Le fichier a été enregistré dans la bibliothèque locale."; +"errors.shareext.personal_quota_reached" = "Vous avez atteint votre quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Consultez les paramètres de votre compte pour connaître les options de stockage supplémentaire.\n\nLe fichier a été enregistré dans votre bibliothèque locale."; +"errors.shareext.group_quota_reached" = "Le groupe “%@” a atteint son quota de stockage Zotero, et le fichier n'a pas pu être mis en ligne. Le propriétaire du groupe peut trouver des options de stockage supplémentaires dans les paramètres de son compte.\n\nLe fichier a été enregistré dans la bibliothèque locale."; "errors.shareext.forbidden" = "Vous n'avez pas les droits nécessaires pour ajouter ce document à %@."; "errors.shareext.webdav_not_verified" = "Erreur de vérification WebDAV"; "errors.shareext.requires_browser" = "Ce contenu doit être chargé dans un navigateur pour être partagé avec Zotero. Ouvrez-le dams votre navigateur et utilisez le bouton Partager du navigateur."; @@ -492,11 +492,11 @@ "errors.logging.no_logs_recorded" = "Il n'y a eu aucune sortie de débogage pendant l'enregistrement"; "errors.logging.upload" = "Impossible de mettre en ligne les enregistrements. Veuillez réessayer."; "errors.logging.response_parsing" = "Réponse inattendue du serveur"; -"errors.translators.bundle_loading" = "Impossible de mettre à jour les convertisseurs. Essayer à nouveau ?"; +"errors.translators.bundle_loading" = "Impossible de mettre à jour les convertisseurs. Essayer à nouveau ?"; "errors.styles.addition" = "Impossible d'ajouter le style “%@”"; "errors.styles.deletion" = "Impossible de supprimer le style “%@”"; "errors.styles.loading" = "Impossible de charger les styles"; -"errors.styles_search.loading" = "Impossible de charger les styles. Essayer à nouveau ?"; +"errors.styles_search.loading" = "Impossible de charger les styles. Essayer à nouveau ?"; "errors.citation.generate_citation" = "Impossible de générer la citation"; "errors.citation.generate_bibliography" = "Impossible de générer la bibliographie"; "errors.citation.invalid_types" = "Types de documents invalides sélectionnés"; diff --git a/Zotero/Assets/it.lproj/InfoPList.strings b/Zotero/Assets/it.lproj/InfoPList.strings index 3b0b49013..83a013afe 100644 --- a/Zotero/Assets/it.lproj/InfoPList.strings +++ b/Zotero/Assets/it.lproj/InfoPList.strings @@ -6,4 +6,4 @@ Copyright © 2024 Corporation for Digital Scholarship. All rights reserved. */ -"my_library" = "My Library"; +"my_library" = "La mia Biblioteca"; diff --git a/Zotero/Assets/it.lproj/Localizable.strings b/Zotero/Assets/it.lproj/Localizable.strings index 48355def2..bc9195106 100644 --- a/Zotero/Assets/it.lproj/Localizable.strings +++ b/Zotero/Assets/it.lproj/Localizable.strings @@ -6,587 +6,587 @@ Copyright © 2020 Corporation for Digital Scholarship. All rights reserved. */ -"close" = "Close"; -"delete" = "Delete"; -"edit" = "Edit"; -"last_updated" = "Last Updated"; -"name" = "Name"; -"save" = "Save"; -"creator" = "Creator"; -"date" = "Date"; -"date_added" = "Date Added"; -"date_modified" = "Date Modified"; -"item_type" = "Item Type"; -"publication_title" = "Publication Title"; -"publisher" = "Publisher"; -"title" = "Title"; -"year" = "Year"; +"close" = "Chiudi"; +"delete" = "Elimina"; +"edit" = "Modifica"; +"last_updated" = "Ultimo aggiornamento"; +"name" = "Nome"; +"save" = "Salva"; +"creator" = "Autore"; +"date" = "Data"; +"date_added" = "Data inserimento"; +"date_modified" = "Data modifica"; +"item_type" = "Tipo di elemento"; +"publication_title" = "Titolo della pubblicazione"; +"publisher" = "Editore"; +"title" = "Titolo"; +"year" = "Anno"; "abstract" = "Abstract"; -"error" = "Error"; -"warning" = "Warning"; -"yes" = "Yes"; +"error" = "Errore"; +"warning" = "Avviso"; +"yes" = "Sì"; "no" = "No"; -"cancel" = "Cancel"; -"done" = "Done"; -"ok" = "OK"; -"add" = "Add"; -"unknown" = "Unknown"; -"retry" = "Retry"; -"page" = "Page"; -"report" = "Report"; -"total" = "Total"; -"restore" = "Restore"; -"copy" = "Copy"; -"privacy_policy" = "Privacy Policy"; -"support_feedback" = "Support and Feedback"; -"about_zotero" = "About Zotero"; -"recent" = "Recents"; -"look_up" = "Look Up"; -"not_found" = "Not Found"; -"share" = "Share"; -"select" = "Select"; -"create" = "Create"; -"more_information" = "More Information"; -"clear" = "Clear"; -"scan_text" = "Scan Text"; -"move_to_trash" = "Move to Trash"; -"size" = "Size"; -"remove" = "Remove"; -"keep" = "Keep"; -"cancel_all" = "Cancel All"; -"back" = "Back"; -"forward" = "Forward"; -"go_to_settings" = "Go to Settings"; -"close_without_saving" = "Close without saving"; -"stay" = "Stay"; +"cancel" = "Annulla"; +"done" = "Fatto"; +"ok" = "Ok"; +"add" = "Aggiungi"; +"unknown" = "Sconosciuto"; +"retry" = "Riprova"; +"page" = "Pagina"; +"report" = "Segnala"; +"total" = "Totale"; +"restore" = "Ripristina"; +"copy" = "Copia"; +"privacy_policy" = "Informativa sulla privacy"; +"support_feedback" = "Supporto e feedback"; +"about_zotero" = "Informazioni su Zotero"; +"recent" = "Recenti"; +"look_up" = "Ricerca"; +"not_found" = "Non trovato"; +"share" = "Condividi"; +"select" = "Seleziona"; +"create" = "Crea"; +"more_information" = "Informazioni aggiuntive"; +"clear" = "Pulisci"; +"scan_text" = "Scansiona testo"; +"move_to_trash" = "Sposta nel cestino"; +"size" = "Dimensione"; +"remove" = "Rimuovi"; +"keep" = "Mantieni"; +"cancel_all" = "Elimina tutti"; +"back" = "Indietro"; +"forward" = "Avanti"; +"go_to_settings" = "Vai alle impostazioni"; +"close_without_saving" = "Chiudi senza salvare"; +"stay" = "Rimani"; -"migration_debug" = "The app failed to initialize and cannot function properly. Please report Debug ID %@ in the Zotero Forums."; -"login_debug" = "The app failed to log in. Please log in again and report Debug ID %@ in the Zotero Forums."; -"full_sync_debug" = "Full sync has finished. Please report Debug ID %@ in the Zotero Forums."; +"migration_debug" = "L'applicazione non si è avviata correttamente. Si prega di inviare il Debug ID %@ nei forum di Zotero."; +"login_debug" = "L'applicazione non ha potuto effettuare l'accesso. Si prega di riprovare ad accedere e segnalare il Debug ID %@ nei forum di Zotero."; +"full_sync_debug" = "La sincronizzazione completa è terminata. Si prega di segnalare il Debug ID %@ nei forum di Zotero."; -"day_suffixes" = "st,nd,rd,th"; +"day_suffixes" = "o"; -"onboarding.access" = "Zotero organizes research however you want. Sort your items into collections and tag them with keywords."; -"onboarding.sync" = "Synchronize and collaborate across devices, keeping your reading and notes seamlessly up to date."; -"onboarding.annotate" = "Highlight and take notes directly in your PDFs as you read them."; -"onboarding.share" = "Tap to collect articles and books directly from the web, including their PDFs and full metadata."; -"onboarding.sign_in" = "Sign In"; -"onboarding.create_account" = "Sign Up"; -"login.username" = "Username"; +"onboarding.access" = "Zotero organizza la tua ricerca secondo le tue necessità. Ordina i tuoi elementi nelle collezioni e aggiungi tag con le parole chiave."; +"onboarding.sync" = "Sincronizza e collabora su più dispositivi, mantenendo le tue letture e le note sempre aggiornate."; +"onboarding.annotate" = "Evidenzia e prendi appunti direttamente nei tuoi PDF man mano che li leggi."; +"onboarding.share" = "Tocca per salvare articoli e libri direttamente dal web, inclusi i PDF e i metadati completi."; +"onboarding.sign_in" = "Accedi"; +"onboarding.create_account" = "Registrati"; +"login.username" = "Nome utente"; "login.password" = "Password"; "login.email" = "Email"; -"login.repeat_password" = "Repeat password"; -"login.forgot_password" = "Forgot Password?"; +"login.repeat_password" = "Ripeti password"; +"login.forgot_password" = "Password dimenticata?"; -"libraries.my_library" = "My Library"; -"libraries.group_libraries" = "Group Libraries"; -"libraries.delete_question" = "Do you really want to delete “%@”?"; +"libraries.my_library" = "La mia Biblioteca"; +"libraries.group_libraries" = "Biblioteche dei gruppi"; +"libraries.delete_question" = "Vuoi davvero eliminare “%@”?"; -"collections.search_title" = "Find Collection"; -"collections.all_items" = "All Items"; -"collections.my_publications" = "My Publications"; -"collections.trash" = "Trash"; -"collections.unfiled" = "Unfiled Items"; -"collections.new_subcollection" = "New Subcollection"; -"collections.edit_title" = "Edit Collection"; -"collections.delete" = "Delete Collection"; -"collections.delete_with_items" = "Delete Collection and Items"; -"collections.create_title" = "Create Collection"; -"collections.picker_title" = "Choose Parent"; -"collections.empty_trash" = "Empty Trash"; -"collections.collapse_all" = "Collapse All"; -"collections.expand_all" = "Expand All"; -"collections.create_bibliography" = "Create Bibliography from Collection"; -"collections.download_attachments" = "Download Attachments"; -"collections.delete_attachment_files" = "Remove Downloads"; +"collections.search_title" = "Trova collezione"; +"collections.all_items" = "Tutti gli elementi"; +"collections.my_publications" = "Le mie pubblicazioni"; +"collections.trash" = "Cestino"; +"collections.unfiled" = "Elementi non collocati"; +"collections.new_subcollection" = "Nuova sottocollezione"; +"collections.edit_title" = "Modifica collezione"; +"collections.delete" = "Elimina collezione"; +"collections.delete_with_items" = "Elimina collezione ed elementi"; +"collections.create_title" = "Crea collezione"; +"collections.picker_title" = "Scegli genitore"; +"collections.empty_trash" = "Svuota il cestino"; +"collections.collapse_all" = "Comprimi tutto"; +"collections.expand_all" = "Espandi tutto"; +"collections.create_bibliography" = "Crea bibliografia dalla collezione"; +"collections.download_attachments" = "Scarica allegati"; +"collections.delete_attachment_files" = "Rimuovi download"; -"sync_toolbar.starting" = "Sync starting"; -"sync_toolbar.groups" = "Syncing groups"; -"sync_toolbar.groups_with_data" = "Syncing groups (%d / %d)"; -"sync_toolbar.library" = "Syncing %@"; -"sync_toolbar.object" = "Syncing %@ in %@"; -"sync_toolbar.object_with_data" = "Syncing %@ (%d / %d) in %@"; -"sync_toolbar.finished" = "Finished sync"; -"sync_toolbar.deletion" = "Applying remote deletions in %@"; -"sync_toolbar.aborted" = "Sync failed (%@)"; -"sync_toolbar.writes" = "Uploading changes (%d / %d)"; -"sync_toolbar.uploads" = "Uploading attachment (%d / %d)"; -"sync_toolbar.object.collections" = "collections"; -"sync_toolbar.object.groups" = "groups"; -"sync_toolbar.object.items" = "items"; -"sync_toolbar.object.searches" = "searches"; +"sync_toolbar.starting" = "Avvio sincronizzazione"; +"sync_toolbar.groups" = "Sincronizzazione gruppi"; +"sync_toolbar.groups_with_data" = "Sincronizzazione gruppi (%d / %d)"; +"sync_toolbar.library" = "Sincronizzazione %@"; +"sync_toolbar.object" = "Sincronizzazione %@ in %@"; +"sync_toolbar.object_with_data" = "Sincronizzazione %@ (%d / %d) in %@"; +"sync_toolbar.finished" = "Sincronizzazione terminata"; +"sync_toolbar.deletion" = "Sto effettuando le eliminazioni remote in %@"; +"sync_toolbar.aborted" = "Sincronizzazione non riuscita (%@)"; +"sync_toolbar.writes" = "Caricamento modifiche (%d / %d)"; +"sync_toolbar.uploads" = "Caricamento allegati (%d / %d)"; +"sync_toolbar.object.collections" = "collezioni"; +"sync_toolbar.object.groups" = "gruppi"; +"sync_toolbar.object.items" = "elementi"; +"sync_toolbar.object.searches" = "ricerche"; -"sync.conflict_resolution.changed_item_deleted" = "The item “%@” has been removed. Do you want to keep your changes?"; +"sync.conflict_resolution.changed_item_deleted" = "L'elemento “%@” è stato rimosso. Vuoi mantenere le tue modifiche?"; -"items.search_title" = "Search Items"; -"items.select_all" = "Select All"; -"items.deselect_all" = "Deselect All"; -"items.sort_by" = "Sort By"; -"items.sort_order" = "Sort Order"; -"items.ascending" = "Ascending"; -"items.descending" = "Descending"; -"items.lookup" = "Add by Identifier"; -"items.barcode" = "Scan Barcode"; -"items.new" = "Add Manually"; -"items.new_note" = "New Standalone Note"; -"items.new_file" = "Add File"; -"items.remove_from_collection_title" = "Remove from Collection"; -"items.action.add_to_collection" = "Add to Collection"; -"items.action.remove_from_collection" = "Remove from Collection"; -"items.action.duplicate" = "Duplicate"; -"items.action.create_parent" = "Create Parent Item"; -"items.action.download" = "Download"; -"items.action.remove_download" = "Remove Download"; -"items.action.retrieve_metadata" = "Retrieve Metadata"; -"items.filters.title" = "Filters"; -"items.filters.downloads" = "Downloaded Files"; -"items.filters.tags" = "Tags"; -"items.toolbar_saved" = "Saved %d / %d"; -"items.toolbar_downloaded" = "Downloaded %d / %d"; -"items.generating_bib" = "Generating Bibliography"; -"items.creator_summary.and" = "%@ and %@"; +"items.search_title" = "Cerca elementi"; +"items.select_all" = "Seleziona tutto"; +"items.deselect_all" = "Deseleziona tutto"; +"items.sort_by" = "Ordina"; +"items.sort_order" = "Ordina per"; +"items.ascending" = "Crescente"; +"items.descending" = "Decrescente"; +"items.lookup" = "Aggiungi da identificatore"; +"items.barcode" = "Scansiona codice a barre"; +"items.new" = "Aggiungi manualmente"; +"items.new_note" = "Nuova nota indipendente"; +"items.new_file" = "Aggiungi file"; +"items.remove_from_collection_title" = "Rimuovi dalla collezione"; +"items.action.add_to_collection" = "Aggiungi alla collezione"; +"items.action.remove_from_collection" = "Rimuovi dalla collezione"; +"items.action.duplicate" = "Duplica"; +"items.action.create_parent" = "Crea elemento genitore"; +"items.action.download" = "Scarica"; +"items.action.remove_download" = "Rimuovi download"; +"items.action.retrieve_metadata" = "Recupera metadati"; +"items.filters.title" = "Fitri"; +"items.filters.downloads" = "File scaricati"; +"items.filters.tags" = "Tag"; +"items.toolbar_saved" = "Salvati %d / %d"; +"items.toolbar_downloaded" = "Scaricati %d / %d"; +"items.generating_bib" = "Generazione bibliografia"; +"items.creator_summary.and" = "%@ e %@"; "items.creator_summary.etal" = "%@ et al."; -"items.retrieving_metadata" = "Retrieving Metadata"; +"items.retrieving_metadata" = "Recupero metadati"; -"lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; +"lookup.title" = "Inserisci uno o più ISBN, DOI, PMID, arXiv ID o ADS Bibcode per aggiungere elementi alla tua biblioteca:"; -"citation.title" = "Citation Preview"; -"citation.copy_citation" = "Copy Citation"; -"citation.copy_bibliography" = "Copy Bibliography"; -"citation.preview" = "Preview"; -"citation.omit_author" = "Omit Author"; -"citation.locator_placeholder" = "Number"; -"citation.locator.page" = "Page"; -"citation.locator.book" = "Book"; -"citation.locator.chapter" = "Chapter"; -"citation.locator.column" = "Column"; -"citation.locator.figure" = "Figure"; -"citation.locator.folio" = "Folio"; -"citation.locator.issue" = "Issue"; -"citation.locator.line" = "Line"; -"citation.locator.note" = "Note"; -"citation.locator.opus" = "Opus"; -"citation.locator.paragraph" = "Paragraph"; -"citation.locator.part" = "Part"; -"citation.locator.section" = "Section"; +"citation.title" = "Anteprima citazione"; +"citation.copy_citation" = "Copia citazione"; +"citation.copy_bibliography" = "Copia bibliografia"; +"citation.preview" = "Anteprima"; +"citation.omit_author" = "Ometti autore"; +"citation.locator_placeholder" = "Numero"; +"citation.locator.page" = "Pagina"; +"citation.locator.book" = "Libro"; +"citation.locator.chapter" = "Capitolo"; +"citation.locator.column" = "Colonna"; +"citation.locator.figure" = "Figura"; +"citation.locator.folio" = "Foglio"; +"citation.locator.issue" = "Fascicolo"; +"citation.locator.line" = "Riga"; +"citation.locator.note" = "Nota"; +"citation.locator.opus" = "Opera"; +"citation.locator.paragraph" = "Paragrafo"; +"citation.locator.part" = "Parte"; +"citation.locator.section" = "Sezione"; "citation.locator.sub verbo" = "Sub verbo"; "citation.locator.volume" = "Volume"; -"citation.locator.verse" = "Verse"; -"citation.style" = "Style"; -"citation.language" = "Language"; -"citation.output_mode" = "Output Mode"; -"citation.citations" = "Citations"; -"citation.bibliography" = "Bibliography"; -"citation.notes" = "Notes"; -"citation.output_method" = "Output Method"; -"citation.save_html" = "Save as HTML"; -"citation.copy" = "Copy to Clipboard"; +"citation.locator.verse" = "Verso"; +"citation.style" = "Stile"; +"citation.language" = "Lingua"; +"citation.output_mode" = "Modalità di output"; +"citation.citations" = "Citazioni"; +"citation.bibliography" = "Bibliografia"; +"citation.notes" = "Note"; +"citation.output_method" = "Metodo di output"; +"citation.save_html" = "Salva come HTML"; +"citation.copy" = "Copia negli appunti"; -"item_detail.add_creator" = "Add Creator"; -"item_detail.notes" = "Notes"; -"item_detail.add_note" = "Add note"; -"item_detail.tags" = "Tags"; -"item_detail.add_tag" = "Add tag"; -"item_detail.attachments" = "Attachments"; -"item_detail.add_attachment" = "Add attachment"; -"item_detail.split_name" = "Split name"; -"item_detail.merge_name" = "Merge name"; -"item_detail.untitled" = "Title"; -"item_detail.show_more" = "Show more"; -"item_detail.show_less" = "Show less"; -"item_detail.view_pdf" = "View PDF"; -"item_detail.data_reloaded" = "This item has been changed remotely. It will now reload."; -"item_detail.delete_attachment_file" = "Remove Download"; -"item_detail.deleted_title" = "Deleted"; -"item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; -"item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; +"item_detail.add_creator" = "Aggiungi autore"; +"item_detail.notes" = "Note"; +"item_detail.add_note" = "Aggiungi nota"; +"item_detail.tags" = "Tag"; +"item_detail.add_tag" = "Aggiungi tag"; +"item_detail.attachments" = "Allegati"; +"item_detail.add_attachment" = "Aggiungi allegato"; +"item_detail.split_name" = "Dividi nome"; +"item_detail.merge_name" = "Unisci nome"; +"item_detail.untitled" = "Titolo"; +"item_detail.show_more" = "Mostra di più"; +"item_detail.show_less" = "Mostra meno"; +"item_detail.view_pdf" = "Visualizza PDF"; +"item_detail.data_reloaded" = "Questo elemento è stato modificato da remoto. Verrà ricaricato."; +"item_detail.delete_attachment_file" = "Rimuovi download"; +"item_detail.deleted_title" = "Eliminato"; +"item_detail.deleted_message" = "Questo elemento è stato eliminato. Vuoi ripristinarlo?"; +"item_detail.move_to_standalone_attachment" = "Converti in allegato indipendente"; -"tag_picker.title" = "%d selected"; -"tag_picker.placeholder" = "Tag name"; -"tag_picker.create_tag" = "Create Tag “%@”"; -"tag_picker.confirm_deletion_question" = "Delete Automatic Tags"; -"tag_picker.search_placeholder" = "Search Tags"; -"tag_picker.deselect_all" = "Deselect All"; -"tag_picker.show_auto" = "Show Automatic Tags"; -"tag_picker.show_all" = "Display All Tags in This Library"; -"tag_picker.delete_automatic" = "Delete Automatic Tags in This Library"; +"tag_picker.title" = "%d selezionati"; +"tag_picker.placeholder" = "Nome tag"; +"tag_picker.create_tag" = "Crea tag “%@”"; +"tag_picker.confirm_deletion_question" = "Elimina tag automatici"; +"tag_picker.search_placeholder" = "Cerca tag"; +"tag_picker.deselect_all" = "Deseleziona tutto"; +"tag_picker.show_auto" = "Mostra tag automatici"; +"tag_picker.show_all" = "Mostra tutti i tag in questa biblioteca"; +"tag_picker.delete_automatic" = "Elimina tag automatici in questa biblioteca"; -"creator_editor.creator" = "Creator Type"; -"creator_editor.first_name" = "First Name"; -"creator_editor.last_name" = "Last Name"; -"creator_editor.switch_to_single" = "Switch to single field"; -"creator_editor.switch_to_dual" = "Switch to two fields"; -"creator_editor.delete_confirmation" = "Do you really want to delete this creator?"; +"creator_editor.creator" = "Tipo di autore"; +"creator_editor.first_name" = "Nome"; +"creator_editor.last_name" = "Cognome"; +"creator_editor.switch_to_single" = "Passa a campo singolo"; +"creator_editor.switch_to_dual" = "Passa a 2 campi separati"; +"creator_editor.delete_confirmation" = "Vuoi eliminare questo autore?"; -"pdf.annotations_sidebar.search_title" = "Search"; -"pdf.annotations_sidebar.add_comment" = "Add comment"; -"pdf.annotations_sidebar.add_tags" = "Add tags"; -"pdf.annotations_sidebar.merge" = "Merge"; -"pdf.annotations_sidebar.filter.title" = "Filter Annotations"; -"pdf.annotations_sidebar.filter.tags_placeholder" = "Select Tags…"; -"pdf.search.title" = "Search in Document"; -"pdf.search.failed" = "Search failed"; -"pdf.search.dismiss" = "Dismiss Search"; -"pdf.annotation_popover.title" = "Edit Annotation"; -"pdf.annotation_popover.delete" = "Delete Annotation"; -"pdf.annotation_popover.update_subsequent_pages" = "Update subsequent pages"; -"pdf.annotation_popover.page_label_title" = "Edit Page Number"; -"pdf.annotation_popover.no_comment" = "No comment"; -"pdf.annotation_popover.line_width" = "Width"; -"pdf.annotation_popover.size" = "Size"; -"pdf.deleted_title" = "Deleted"; -"pdf.deleted_message" = "This document has been deleted. Do you want to restore it?"; +"pdf.annotations_sidebar.search_title" = "Cerca"; +"pdf.annotations_sidebar.add_comment" = "Aggiungi commento"; +"pdf.annotations_sidebar.add_tags" = "Aggiungi tag"; +"pdf.annotations_sidebar.merge" = "Unisci"; +"pdf.annotations_sidebar.filter.title" = "Filtra le annotazioni"; +"pdf.annotations_sidebar.filter.tags_placeholder" = "Seleziona tag..."; +"pdf.search.title" = "Cerca nel documento"; +"pdf.search.failed" = "Ricerca non riuscita"; +"pdf.search.dismiss" = "Scarta ricerca"; +"pdf.annotation_popover.title" = "Modifica annotazione"; +"pdf.annotation_popover.delete" = "Elimina annotazione"; +"pdf.annotation_popover.update_subsequent_pages" = "Aggiorna pagine successive"; +"pdf.annotation_popover.page_label_title" = "Modica numero di pagina"; +"pdf.annotation_popover.no_comment" = "Nessun commento"; +"pdf.annotation_popover.line_width" = "Larghezza"; +"pdf.annotation_popover.size" = "Dimensione"; +"pdf.deleted_title" = "Eliminato"; +"pdf.deleted_message" = "Questo documento è stato eliminato. Vuoi ripristinarlo?"; "pdf.line_width_point" = "%0.1f pt"; -"pdf.highlight" = "Highlight"; -"pdf.underline" = "Underline"; -"pdf.annotation_share.image.share" = "Share image"; -"pdf.annotation_share.image.medium" = "Medium"; -"pdf.annotation_share.image.large" = "Large"; -"pdf.annotation_toolbar.eraser" = "Eraser"; -"pdf.annotation_toolbar.highlight" = "Highlight"; -"pdf.annotation_toolbar.note" = "Note"; -"pdf.annotation_toolbar.image" = "Image"; -"pdf.annotation_toolbar.ink" = "Ink"; -"pdf.annotation_toolbar.underline" = "Underline"; -"pdf.annotation_toolbar.text" = "Text"; -"pdf.locked.locked" = "Locked"; -"pdf.locked.enter_password" = "Please enter the password to open this PDF."; -"pdf.locked.failed" = "Incorrect password. Please try again."; -"pdf.settings.scroll_direction.title" = "Scroll Direction"; -"pdf.settings.scroll_direction.horizontal" = "Horizontal"; -"pdf.settings.scroll_direction.vertical" = "Vertical"; -"pdf.settings.page_transition.title" = "Page Transition"; -"pdf.settings.page_transition.jump" = "Jump"; -"pdf.settings.page_transition.continuous" = "Continuous"; -"pdf.settings.appearance.title" = "Appearance"; -"pdf.settings.appearance.auto" = "Automatic"; -"pdf.settings.appearance.light_mode" = "Light"; -"pdf.settings.appearance.dark_mode" = "Dark"; -"pdf.settings.appearance.sepia_mode" = "Sepia"; -"pdf.settings.page_mode.title" = "Page Mode"; -"pdf.settings.page_mode.single" = "Single"; -"pdf.settings.page_mode.double" = "Double"; -"pdf.settings.page_mode.automatic" = "Automatic"; -"pdf.settings.page_fitting.title" = "Page Fitting"; -"pdf.settings.page_fitting.fit" = "Fit"; -"pdf.settings.page_fitting.fill" = "Fill"; -"pdf.settings.page_spreads.title" = "Page Spreads"; -"pdf.settings.page_spreads.odd" = "Odd"; -"pdf.settings.page_spreads.even" = "Even"; -"pdf.settings.page_fitting.automatic" = "Automatic"; -"pdf.export.export" = "Export PDF"; -"pdf.export.export_annotated" = "Export Annotated PDF"; -"pdf.sidebar.no_annotations" = "No Annotations"; -"pdf.sidebar.no_outline" = "No Outline"; -"pdf.delete_annotation" = "Do you really want to delete this annotation?"; -"pdf.previous_page" = "Previous Page"; -"pdf.next_page" = "Next Page"; -"pdf.previous_viewport" = "Previous Viewport"; -"pdf.next_viewport" = "Next Viewport"; +"pdf.highlight" = "Evidenzia"; +"pdf.underline" = "Sottolinea"; +"pdf.annotation_share.image.share" = "Condividi immagine"; +"pdf.annotation_share.image.medium" = "Medio"; +"pdf.annotation_share.image.large" = "Grande"; +"pdf.annotation_toolbar.eraser" = "Gomma"; +"pdf.annotation_toolbar.highlight" = "Evidenzia"; +"pdf.annotation_toolbar.note" = "Nota"; +"pdf.annotation_toolbar.image" = "Immagine"; +"pdf.annotation_toolbar.ink" = "Scrittura a mano libera"; +"pdf.annotation_toolbar.underline" = "Sottolinea"; +"pdf.annotation_toolbar.text" = "Testo"; +"pdf.locked.locked" = "Protetto"; +"pdf.locked.enter_password" = "Si prega di inserire la password per aprire questo PDF."; +"pdf.locked.failed" = "Password non corretta. Si prega di riprovare."; +"pdf.settings.scroll_direction.title" = "Direzione dello scorrimento"; +"pdf.settings.scroll_direction.horizontal" = "Orizzontale"; +"pdf.settings.scroll_direction.vertical" = "Verticale"; +"pdf.settings.page_transition.title" = "Transizione di pagina"; +"pdf.settings.page_transition.jump" = "Salto"; +"pdf.settings.page_transition.continuous" = "Continua"; +"pdf.settings.appearance.title" = "Aspetto"; +"pdf.settings.appearance.auto" = "Automatico"; +"pdf.settings.appearance.light_mode" = "Chiaro"; +"pdf.settings.appearance.dark_mode" = "Scuro"; +"pdf.settings.appearance.sepia_mode" = "Seppia"; +"pdf.settings.page_mode.title" = "Modalità di pagina"; +"pdf.settings.page_mode.single" = "Singola"; +"pdf.settings.page_mode.double" = "Doppia"; +"pdf.settings.page_mode.automatic" = "Automatica"; +"pdf.settings.page_fitting.title" = "Adattamento pagina"; +"pdf.settings.page_fitting.fit" = "Adatta"; +"pdf.settings.page_fitting.fill" = "Riempi"; +"pdf.settings.page_spreads.title" = "Disposizione pagina"; +"pdf.settings.page_spreads.odd" = "Dispari"; +"pdf.settings.page_spreads.even" = "Pari"; +"pdf.settings.page_fitting.automatic" = "Automatica"; +"pdf.export.export" = "Esporta PDF"; +"pdf.export.export_annotated" = "Esporta PDF con annotazioni"; +"pdf.sidebar.no_annotations" = "Nessuna annotazione"; +"pdf.sidebar.no_outline" = "Nessuna struttura"; +"pdf.delete_annotation" = "Vuoi eliminare questa annotazione?"; +"pdf.previous_page" = "Pagina precedente"; +"pdf.next_page" = "Pagina successiva"; +"pdf.previous_viewport" = "Viewport precedente"; +"pdf.next_viewport" = "Viewport successiva"; -"settings.title" = "Settings"; -"settings.logout" = "Sign Out"; -"settings.logout_warning" = "Any local data that was not synced will be deleted. Do you really want to sign out?"; -"settings.general.title" = "General"; -"settings.general.show_subcollections_title" = "Show Items from Subcollections"; -"settings.general.show_collection_item_counts" = "Show Collection Sizes"; -"settings.general.open_links_in_external_browser" = "Open Links in External Browser"; -"settings.general.autoempty_title" = "Delete Items in Trash"; -"settings.general.never" = "Never"; -"settings.item_count" = "Item count"; -"settings.item_count_subtitle" = "Show item count for all collections."; +"settings.title" = "Impostazioni"; +"settings.logout" = "Disconnetti"; +"settings.logout_warning" = "Qualsiasi dato in locale non sincronizzato verrà eliminato. Vuoi disconnetterti?"; +"settings.general.title" = "Generale"; +"settings.general.show_subcollections_title" = "Mostri elementi dalle sottocollezioni"; +"settings.general.show_collection_item_counts" = "Mostra dimensioni delle collezioni"; +"settings.general.open_links_in_external_browser" = "Apri link in un browser esterno"; +"settings.general.autoempty_title" = "Elimina elementi nel cestino"; +"settings.general.never" = "Mai"; +"settings.item_count" = "Numero di elementi"; +"settings.item_count_subtitle" = "Mostra il numero di elementi per tutte le collezioni"; "settings.sync.title" = "Account"; -"settings.sync.data_syncing" = "Data Syncing"; -"settings.sync.file_syncing" = "File Syncing"; -"settings.sync.file_syncing_type_message" = "Sync attachment files in My Library using"; +"settings.sync.data_syncing" = "Sincronizzazione dei dati"; +"settings.sync.file_syncing" = "Sincronizzazione dei file"; +"settings.sync.file_syncing_type_message" = "Sincronizza allegati nella mia libreria con"; "settings.sync.account" = "Account"; -"settings.sync.manage_account" = "Manage Account"; -"settings.sync.delete_account" = "Delete Account"; -"settings.sync.username" = "Username"; +"settings.sync.manage_account" = "Gestisci account"; +"settings.sync.delete_account" = "Elimina account"; +"settings.sync.username" = "Nome utente"; "settings.sync.password" = "Password"; -"settings.sync.verify" = "Verify Server"; -"settings.sync.directory_not_found.title" = "Directory not found"; -"settings.sync.directory_not_found.message" = "%@ does not exist.\n\nDo you want to create it now?"; -"settings.sync.verified" = "Verified"; -"settings.permission" = "User Permission"; -"settings.permission_subtitle" = "Ask for user permission for each write action"; -"settings.translators" = "Translators"; -"settings.translators_update" = "Update translators"; -"settings.translators_updating" = "Updating…"; -"settings.reset_to_bundled" = "Reset to bundled"; -"settings.debug" = "Debug Output Logging"; -"settings.logging_title" = "Logging"; -"settings.start_logging" = "Start Logging"; -"settings.start_logging_on_launch" = "Start Logging on Next App Launch"; -"settings.cancel_logging" = "Cancel Logging"; -"settings.stop_logging" = "Stop Logging"; -"settings.view_output" = "View Output"; -"settings.clear_output" = "Clear Output"; -"settings.logging_desc1" = "To debug a startup issue, force-quit the app and start it again."; -"settings.logging_desc2" = "To debug a share-extension issue, open the share extension."; -"settings.send_manually" = "Send Manually"; -"settings.log_alert.progress_title" = "Sending Logs"; -"settings.log_alert.title" = "Logs Sent"; -"settings.log_alert.message" = "Your Debug ID is %@"; -"settings.crash_alert.title" = "Crash Log Sent"; -"settings.crash_alert.message" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash."; -"settings.crash_alert.message_with_db" = "Your Report ID is %@.\n\nPlease post a message to the Zotero Forums (forums.zotero.org) with this Report ID and any steps necessary to reproduce the crash.\n\nIf Zotero crashes repeatedly, please tap “Export Database” and send exported files to support@zotero.org."; -"settings.crash_alert.submit_forum" = "Submit to Zotero Forums"; -"settings.crash_alert.export_db" = "Copy and Export Database"; -"settings.crash_alert.copy" = "Copy to Clipboard"; -"settings.websocket_title" = "Server Connection"; -"settings.websocket_connected" = "Connected"; -"settings.websocket_connecting" = "Connecting"; -"settings.websocket_disconnected" = "Disconnected"; -"settings.websocket_disconnect" = "Disconnect from Server"; -"settings.websocket_connect" = "Connect to Server"; -"settings.storage" = "Local Storage"; -"settings.storage.delete_all" = "Delete All Local Attachment Files"; -"settings.storage.delete_all_question" = "Are you sure you want to delete all attachment files from this device?\n\nOther synced devices will not be affected."; -"settings.storage.delete_library_question" = "Are you sure you want to delete all attachment files in %@ from this device?\n\nOther synced devices will not be affected."; -"settings.saving.title" = "Saving"; -"settings.saving.files_title" = "Save Files"; -"settings.saving.files_message" = "Automatically attach associated PDFs and other files when saving items"; -"settings.saving.tags_title" = "Save Automatic Tags"; -"settings.saving.tags_message" = "Automatically tag items with keywords and subject headings"; -"settings.cite.title" = "Cite"; -"settings.cite.styles_title" = "Citation Styles"; -"settings.cite.get_more_styles" = "Get additional styles"; -"settings.cite_search.search_title" = "Search styles"; -"settings.export.title" = "Quick Copy"; -"settings.export.default_format" = "Default Format"; -"settings.export.language" = "Language"; -"settings.export.copy_as_html" = "Copy as HTML"; -"settings.versionAndBuild" = "Version %@ Build %@"; -"settings.export_db" = "Export Database File"; -"settings.full_sync_debug" = "Advanced"; -"settings.full_sync.start" = "Start Full Sync Debugging"; -"settings.full_sync.other_in_progress" = "A sync is already in progress. Please wait for it to finish."; -"settings.full_sync.in_progress" = "A full sync is in progress. Please wait for it to finish and post the Debug ID to the Zotero Forums."; -"settings.annotation_tools" = "Annotation Tools"; +"settings.sync.verify" = "Verifica server"; +"settings.sync.directory_not_found.title" = "Cartella non trovata"; +"settings.sync.directory_not_found.message" = "%@ non esiste.\n\nVuoi crearla ora?"; +"settings.sync.verified" = "Verificato"; +"settings.permission" = "Permesso utente"; +"settings.permission_subtitle" = "Chiedi il permesso all'utente per ogni azione di scrittura"; +"settings.translators" = "Traduttori"; +"settings.translators_update" = "Aggiorna i programmi traduttori"; +"settings.translators_updating" = "Aggiornamento..."; +"settings.reset_to_bundled" = "Ripristina originali"; +"settings.debug" = "Registra output di debug"; +"settings.logging_title" = "Registrazione"; +"settings.start_logging" = "Inizia registrazione"; +"settings.start_logging_on_launch" = "Inizia registrazione al prossimo avvio dell'applicazione"; +"settings.cancel_logging" = "Annulla registrazione"; +"settings.stop_logging" = "Interrompi registrazione"; +"settings.view_output" = "Mostra output"; +"settings.clear_output" = "Pulisci output"; +"settings.logging_desc1" = "Per effettuare il debug di un problema di avvio, forza la chiusura dell'applicazione e avviala di nuovo."; +"settings.logging_desc2" = "Per effettuare il debug di un problema dell'estensione di condivisione, apri l'estensione."; +"settings.send_manually" = "Invia manualmente"; +"settings.log_alert.progress_title" = "Invio log"; +"settings.log_alert.title" = "Log inviati"; +"settings.log_alert.message" = "Il tuo Debug ID è %@"; +"settings.crash_alert.title" = "Crash log inviato"; +"settings.crash_alert.message" = "Il tuo Report ID è %@.\n\nTi preghiamo di inserire un messaggio in inglese nei forum di Zotero (forums.zotero.org) indicando questo Report ID e tutti i passaggi necessari per riprodurre l'errore."; +"settings.crash_alert.message_with_db" = "Il tuo Report ID è %@.\n\nTi preghiamo di inserire un messaggio in inglese nei forum di Zotero (forums.zotero.org) indicando questo Report ID e tutti i passaggi necessari per riprodurre l'errore.\n\nSe Zotero dovesse bloccarsi ripetutamente, tocca \"Esporta database\" e invia i file esportati a support@zotero.org."; +"settings.crash_alert.submit_forum" = "Invia a forum Zotero"; +"settings.crash_alert.export_db" = "Copia ed esporta database"; +"settings.crash_alert.copy" = "Copia negli appunti"; +"settings.websocket_title" = "Connessione al server"; +"settings.websocket_connected" = "Connesso"; +"settings.websocket_connecting" = "Connessione in corso"; +"settings.websocket_disconnected" = "Disconnesso"; +"settings.websocket_disconnect" = "Disconnetti dal server"; +"settings.websocket_connect" = "Connetti al server"; +"settings.storage" = "Spazio di archiviazione locale"; +"settings.storage.delete_all" = "Elimina tutti i file allegati locali"; +"settings.storage.delete_all_question" = "Vuoi eliminare tutti i file allegati locali da questo dispositivo?\n\nGli altri dispositivi sincronizzati non subiranno modifiche."; +"settings.storage.delete_library_question" = "Vuoi eliminare tutti i file allegati locali in %@ da questo dispositivo?\n\nGli altri dispositivi sincronizzati non subiranno modifiche."; +"settings.saving.title" = "Salvataggio"; +"settings.saving.files_title" = "Salva file"; +"settings.saving.files_message" = "Allega automaticamente i file PDF o di altro tipo durante il salvataggio degli elementi"; +"settings.saving.tags_title" = "Salva tag automatici"; +"settings.saving.tags_message" = "Aggiungi automaticamente uno o più tag agli elementi usando parole chiave e soggetti"; +"settings.cite.title" = "Citazione"; +"settings.cite.styles_title" = "Stili di citazione"; +"settings.cite.get_more_styles" = "Scarica altri stili"; +"settings.cite_search.search_title" = "Cerca stili"; +"settings.export.title" = "Copia veloce"; +"settings.export.default_format" = "Formato predefinito"; +"settings.export.language" = "Lingua"; +"settings.export.copy_as_html" = "Copia come HTML"; +"settings.versionAndBuild" = "Versione %@ Build %@"; +"settings.export_db" = "Esporta file del database"; +"settings.full_sync_debug" = "Avanzate"; +"settings.full_sync.start" = "Avvia debug completo della sincronizzazione"; +"settings.full_sync.other_in_progress" = "È in corso una sincronizzazione. Si prega di attendere la sua conclusione."; +"settings.full_sync.in_progress" = "È in corso una sincronizzazione completa. Si prega di attendere la sua conclusione e di inviare il Debug ID ai forum di Zotero."; +"settings.annotation_tools" = "Strumenti di annotazione"; "settings.annotation_tools.pdf" = "PDF"; "settings.annotation_tools.html_epub" = "HTML / EPUB"; -"settings.annotation_tools.reset" = "Reset"; +"settings.annotation_tools.reset" = "Ripristina"; -"shareext.save" = "Save to Zotero"; -"shareext.decoding_attachment" = "Searching for items"; -"shareext.translation.item_selection" = "Choose an item"; -"shareext.translation.translating_with" = "Saving with %@"; -"shareext.loading_collections" = "Loading Collections"; -"shareext.sync_error" = "Unable to sync collections"; -"shareext.collection_other" = "More"; -"shareext.item_title" = "Item"; -"shareext.collection_title" = "Collection"; -"shareext.tags_title" = "Tags"; +"shareext.save" = "Salva in Zotero"; +"shareext.decoding_attachment" = "Ricerca elementi"; +"shareext.translation.item_selection" = "Scegli un elemento"; +"shareext.translation.translating_with" = "Salvando con %@"; +"shareext.loading_collections" = "Caricamento collezioni"; +"shareext.sync_error" = "Impossibile sincronizzare le collezioni"; +"shareext.collection_other" = "Altro"; +"shareext.item_title" = "Elemento"; +"shareext.collection_title" = "Collezione"; +"shareext.tags_title" = "Tag"; -"searchbar.placeholder" = "Search"; -"searchbar.accessibility_cancel" = "Cancel Search"; -"searchbar.accessibility_clear" = "Clear Search"; +"searchbar.placeholder" = "Cerca"; +"searchbar.accessibility_cancel" = "Annulla ricerca"; +"searchbar.accessibility_clear" = "Pulisci ricerca"; -"errors.schema" = "Some data in My Library could not be downloaded. It may have been saved with a newer version of Zotero.\n\nOther data will continue to sync."; -"errors.parsing" = "Could not parse some data. Other data will continue to sync."; -"errors.api" = "Failed API response: %@"; -"errors.db" = "Could not connect to database. The device storage might be full."; -"errors.versionMismatch" = "A remote change was made during the sync"; -"errors.unknown" = "Unknown error"; -"errors.attachments.cant_unzip_snapshot" = "Unable to unzip snapshot"; -"errors.attachments.incompatible_attachment" = "Linked files are not supported on mobile devices. You can open them using the Zotero desktop app."; -"errors.attachments.cant_open_attachment" = "The attached file could not be found."; -"errors.attachments.missing_zotero" = "The attached file is not available in the online library."; -"errors.attachments.missing_webdav" = "The attached file is not available on the WebDAV server."; -"errors.attachments.missing_additional" = "Please check that the file has synced on the device where it was added."; -"errors.attachments.unauthorized_webdav" = "The WebDAV server did not accept the username and password you have saved in settings."; -"errors.attachments.too_many_requests_webdav" = "The WebDAV server is limiting your requests. Try again in a few minutes or check your login credentials."; -"errors.attachments.too_many_requests" = "Too many requests. Please try again in a few minutes."; -"errors.attachments.forbidden_webdav" = "You don’t have permission to access %@ on the WebDAV server."; -"errors.attachments.generic_filename" = "the file"; -"errors.login.invalid_password" = "Invalid password"; -"errors.login.invalid_username" = "Invalid username"; -"errors.login.invalid_credentials" = "Invalid username or password"; -"errors.libraries.cantLoad" = "Unable to load libraries"; -"errors.collections.empty_name" = "Please enter a collection name"; -"errors.collections.save_failed" = "Unable to save collection"; -"errors.collections.bibliography_failed" = "Could not load items for bibliography"; -"errors.sync.group_removed" = "The group “%@” is no longer accessible. What would you like to do?"; -"errors.sync.metadata_write_denied" = "You can no longer write to the group “%@”. What would you like to do?"; -"errors.sync.revert_to_original" = "Revert to original"; -"errors.sync.file_write_denied" = "You no longer have file-editing access for the group “%@”, and files you’ve changed locally cannot be uploaded. If you continue, all group files will be reset to their state on %@.\n\nIf you would like a chance to copy modified files elsewhere or to request file-editing access from a group administrator, you can skip syncing of the group now."; -"errors.sync.reset_group_files" = "Reset Group Files and Sync"; -"errors.sync.skip_group" = "Skip Group"; -"errors.sync_toolbar.finished_with_errors" = "Finished sync (%@)"; -"errors.sync_toolbar.attachment_missing" = "Unable to upload attachment: %@. Please try removing and re-adding the attachment."; -"errors.sync_toolbar.libraries_missing" = "No libraries found. Please sign out and back in again."; -"errors.sync_toolbar.groups_failed" = "Could not sync groups. Please try again."; -"errors.sync_toolbar.conflict_retry_limit" = "Remote sync in progress. Please try again in a few minutes."; -"errors.sync_toolbar.group_permissions" = "You don’t have permission to edit groups."; -"errors.sync_toolbar.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.sync_toolbar.personal_quota_reached" = "You have reached your Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nSee your zotero.org account settings for additional storage options."; -"errors.sync_toolbar.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota. Some files were not uploaded. Other Zotero data will continue to sync.\n\nThe group owner can increase the group’s storage capacity from their storage settings on zotero.org."; -"errors.sync_toolbar.insufficient_space" = "You have insufficient space on your WebDAV server. Some files were not uploaded. Other Zotero data will continue to sync."; -"errors.sync_toolbar.quota_reached_short" = "Quota Reached."; -"errors.sync_toolbar.unavailable" = "Zotero services are temporarily unavailable. Please try again in a few minutes."; -"errors.sync_toolbar.webdav_error" = "Could not delete files from your WebDAV server: \"%@\"."; -"errors.sync_toolbar.webdav_item_prop" = "Invalid prop file: %@"; -"errors.sync_toolbar.show_item" = "Show Item"; -"errors.sync_toolbar.show_items" = "Show Items"; -"errors.sync_toolbar.forbidden" = "Invalid username or password"; -"errors.sync_toolbar.forbidden_message" = "The Zotero sync server did not accept your username and password.\n\nPlease log out and log in with correct login information."; -"errors.sync_toolbar.webdav_request_failed" = "Your WebDAV server returned an HTTP %d error for a %@ request."; -"errors.items.loading" = "Could not load items"; -"errors.items.deletion" = "Could not remove item"; -"errors.items.deletion_from_collection" = "Could not remove item from collection"; -"errors.items.add_to_collection" = "Could not add item to collection"; -"errors.items.move_item" = "Could not move item"; -"errors.items.save_note" = "Could not save note"; -"errors.items.add_attachment" = "Could not add attachment"; -"errors.items.add_some_attachments" = "Some attachments were not added: %@"; -"errors.items.load_duplication" = "Could not load item to duplicate"; -"errors.items.generating_bib" = "Could not generate bibliography"; -"errors.citation_preview" = "Could not generate citation preview"; -"errors.item_detail.dropped_fields_title" = "Change Item Type"; -"errors.item_detail.dropped_fields_message" = "Are you sure you want to change the item type?\n\nThe following fields will be lost:\n\n%@"; -"errors.item_detail.cant_load_data" = "Could not load data. Please try again."; -"errors.item_detail.cant_create_attachments_with_names" = "Could not create attachments: %@"; -"errors.item_detail.cant_create_attachments" = "Could not create attachments"; -"errors.item_detail.cant_save_note" = "Could not save note"; -"errors.item_detail.cant_save_changes" = "Could not save changes"; -"errors.item_detail.cant_trash_item" = "Could not move item to trash"; -"errors.item_detail.cant_save_tags" = "Could not save tags"; -"errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; -"errors.settings.storage" = "Could not collect storage data"; -"errors.settings.webdav.file_missing_after_upload" = "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."; -"errors.settings.webdav.invalid_url" = "WebDAV verification error"; -"errors.settings.webdav.no_password" = "WebDAV verification error"; -"errors.settings.webdav.no_url" = "WebDAV verification error"; -"errors.settings.webdav.no_username" = "WebDAV verification error"; -"errors.settings.webdav.non_existent_file_not_missing" = "WebDAV verification error"; -"errors.settings.webdav.not_dav" = "Not a valid WebDAV URL"; -"errors.settings.webdav.parent_dir_not_found" = "WebDAV verification error"; -"errors.settings.webdav.zotero_dir_not_found" = "WebDAV verification error"; -"errors.settings.webdav.unauthorized" = "The WebDAV server did not accept the username and password you entered."; -"errors.settings.webdav.forbidden" = "You don’t have permission to access the specified folder on the WebDAV server."; -"errors.settings.webdav.internet_connection" = "Unable to connect to the network. Please try again."; -"errors.settings.webdav.host_not_found" = "Could not connect to WebDAV server"; -"errors.settings.webdav.ats" = "Due to iOS restrictions, you must use HTTPS to connect to a non-local WebDAV server."; -"errors.shareext.logged_out" = "Please log into the app before using this extension."; -"errors.shareext.cant_load_data" = "Failed to load data. Please try again."; -"errors.shareext.unknown" = "An unknown error occurred."; -"errors.shareext.cant_load_schema" = "An error occurred. Please open the Zotero app, sync, and try again."; -"errors.shareext.download_failed" = "Could not download file"; -"errors.shareext.items_not_found" = "No items found on page"; -"errors.shareext.schema_error" = "Some data could not be downloaded. It may have been saved with a newer version of Zotero."; -"errors.shareext.translation_failed" = "Saving failed"; -"errors.shareext.response_missing_data" = "An error occurred. Please try again."; -"errors.shareext.failed_additional" = "You can still save this page as a webpage item."; -"errors.shareext.file_not_pdf" = "Unable to save PDF"; -"errors.shareext.api_error" = "Error uploading item. The item was saved to your local library."; -"errors.shareext.webdav_error" = "Error uploading attachment to WebDAV server"; -"errors.shareext.personal_quota_reached" = "You have reached your Zotero Storage quota, and the file could not be uploaded. See your account settings for additional storage options.\n\nThe file was saved to your local library."; -"errors.shareext.group_quota_reached" = "The group “%@” has reached its Zotero Storage quota, and the file could not be uploaded. The group owner can view their account settings for additional storage options.\n\nThe file was saved to the local library."; -"errors.shareext.forbidden" = "You don’t have the necessary permissions to add this item to %@."; -"errors.shareext.webdav_not_verified" = "WebDAV verification error"; -"errors.shareext.requires_browser" = "This content must be loaded in a browser to be shared with Zotero. Open it in your browser and use the browser’s Share button."; -"errors.db_failure" = "Error creating database. Please try logging in again."; -"errors.logging.title" = "Debugging Error"; -"errors.logging.start" = "Unable to start debug logging"; -"errors.logging.no_logs_recorded" = "No debug output occurred during logging"; -"errors.logging.upload" = "Could not upload logs. Please try again."; -"errors.logging.response_parsing" = "Unexpected response from server"; -"errors.translators.bundle_loading" = "Could not update translators. Try again?"; -"errors.styles.addition" = "Could not add style “%@”"; -"errors.styles.deletion" = "Could not delete style “%@”"; -"errors.styles.loading" = "Could not load styles"; -"errors.styles_search.loading" = "Could not load styles. Try again?"; -"errors.citation.generate_citation" = "Could not generate citation"; -"errors.citation.generate_bibliography" = "Could not generate bibliography"; -"errors.citation.invalid_types" = "Invalid item types selected"; -"errors.citation.missing_style" = "No citation style selected. Go to Settings → Quick Copy and select a new style."; -"errors.citation.open_settings" = "Open Settings"; -"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero could not find any identifiers in your input. Please verify your input and try again."; -"errors.lookup.no_identifiers_with_lookup_data" = "Zotero could not find any new identifiers in your input, or they are already being added. Please verify your input and try again."; -"errors.pdf.merge_too_big_title" = "Unable to merge annotations"; -"errors.pdf.merge_too_big" = "The combined annotation would be too large."; -"errors.pdf.cant_update_annotation" = "Can’t update annotation"; -"errors.pdf.cant_add_annotations" = "Can’t add annotations"; -"errors.pdf.cant_delete_annotations" = "Can’t delete annotations"; -"errors.pdf.incompatible_document" = "This document is not supported."; -"errors.pdf.empty_document" = "This document is empty."; -"errors.pdf.page_index_not_int" = "Incorrect format of page stored for this document"; -"errors.pdf.document_changed" = "This document has been changed on another device. Please reopen it to continue editing."; +"errors.schema" = "Alcuni dati in La mia biblioteca non possono essere scaricati. Potrebbero essere stati salvati con una versione più nuova di Zotero.\n\nGli altri dati continueranno ad essere sincronizzati."; +"errors.parsing" = "Non è possibile elaborare alcuni dati. Gli altri dati continueranno a essere sincronizzati."; +"errors.api" = "La risposta API è fallita: %@"; +"errors.db" = "Non è possibile connettersi al database. Lo spazio di archiviazione potrebbe essere pieno."; +"errors.versionMismatch" = "È stata effettuata una modifica da remoto durante la sincronizzazione"; +"errors.unknown" = "Errore sconosciuto"; +"errors.attachments.cant_unzip_snapshot" = "Impossibile decomprimere lo snapshot"; +"errors.attachments.incompatible_attachment" = "I file collegati non sono supportati nei dispositivi mobile. Possono essere aperti con l'applicazione desktop di Zotero."; +"errors.attachments.cant_open_attachment" = "Impossibile trovare il file allegato."; +"errors.attachments.missing_zotero" = "Il file allegato non è disponibile nella biblioteca online."; +"errors.attachments.missing_webdav" = "Il file allegato non è disponibile nel server WebDAV."; +"errors.attachments.missing_additional" = "Si prega di controllare che il file sia stato sincronizzato dal dispositivo da cui è stato aggiunto."; +"errors.attachments.unauthorized_webdav" = "Il server WebDAV non ha accettato il nome utente e la password indicate nelle impostazioni."; +"errors.attachments.too_many_requests_webdav" = "Il server WebDAV sta limitando le richieste. Riprova tra qualche minuto o controlla le credenziali di login."; +"errors.attachments.too_many_requests" = "Troppe richieste. Si prega di riprovare tra qualche minuto."; +"errors.attachments.forbidden_webdav" = "Non hai il permesso di accedere a %@ sul server WebDAV."; +"errors.attachments.generic_filename" = "il file"; +"errors.login.invalid_password" = "Password non valida"; +"errors.login.invalid_username" = "Nome utente non valido"; +"errors.login.invalid_credentials" = "Nome utente o password non validi"; +"errors.libraries.cantLoad" = "Impossibile caricare le biblioteche"; +"errors.collections.empty_name" = "Inserire un nome per la collezione"; +"errors.collections.save_failed" = "Impossibile salvare la collezione"; +"errors.collections.bibliography_failed" = "Impossibile caricare elementi per la bibliografia"; +"errors.sync.group_removed" = "Il gruppo “%@” non è più accessibile. Cosa vorresti fare?"; +"errors.sync.metadata_write_denied" = "Non hai più accesso in scrittura al gruppo “%@”. Cosa vorresti fare?"; +"errors.sync.revert_to_original" = "Ripristina originale"; +"errors.sync.file_write_denied" = "Non hai più accesso in scrittura al gruppo “%@” e i file che hai modificato localmente non possono essere sincronizzati. Se continui, tutti i file del gruppo verranno ripristinati al loro stato su %@.\n\nSe vuoi avere la possibilità di copiare i file modificati da un'altra parte o ri richiedere l'accesso in scrittura all'amministratore del gruppo, puoi saltare la sincronizzazione del gruppo."; +"errors.sync.reset_group_files" = "Ripristina file del gruppo e sincronizza"; +"errors.sync.skip_group" = "Salta gruppo"; +"errors.sync_toolbar.finished_with_errors" = "Sincronizzazione terminata (%@)"; +"errors.sync_toolbar.attachment_missing" = "Impossibile caricare allegato: %@. Si prega di rimuovere e aggiungere nuovamente l'allegato."; +"errors.sync_toolbar.libraries_missing" = "Nessuna biblioteca trovata. Si prega di disconnettersi e connettersi nuovamente."; +"errors.sync_toolbar.groups_failed" = "Impossibile sincronizzare i gruppi. Si prega di riprovare."; +"errors.sync_toolbar.conflict_retry_limit" = "Sincronizzazione in corso. Si prega di riprovare tra qualche minuto."; +"errors.sync_toolbar.group_permissions" = "Non hai il permesso di modificare i gruppi."; +"errors.sync_toolbar.internet_connection" = "Impossibile connettersi alla rete. Si prega di riprovare."; +"errors.sync_toolbar.personal_quota_reached" = "Hai raggiunto la tua quota massima dello spazio di archiviazione di Zotero. Non è stato possibile caricare alcuni file, ma gli altri dati di Zotero continueranno a essere sincronizzati.\n\nConsulta le impostazioni del tuo account su zotero.org per aumentare lo spazio a disposizione."; +"errors.sync_toolbar.group_quota_reached" = "Il gruppo ha raggiunto la quota massima dello spazio di archiviazione di Zotero. Non è stato possibile caricare alcuni file, ma gli altri dati di Zotero continueranno a essere sincronizzati.\n\nIl proprietario del gruppo può aumentare lo spazio di archiviazione del gruppo dalle impostazioni di archiviazione su zotero.org."; +"errors.sync_toolbar.insufficient_space" = "Lo spazio sul server WebDAV è insufficiente. Non è stato possibile caricare alcuni file, ma gli altri dati di Zotero continueranno a essere sincronizzati."; +"errors.sync_toolbar.quota_reached_short" = "Limite raggiunto."; +"errors.sync_toolbar.unavailable" = "I servizi di Zotero sono momentaneamente non disponibili. Si prega di riprovare tra qualche minuto."; +"errors.sync_toolbar.webdav_error" = "Impossibile eliminare il file dal server WebDAV: \"%@\"."; +"errors.sync_toolbar.webdav_item_prop" = "File prop non valido: %@"; +"errors.sync_toolbar.show_item" = "Mostra elemento"; +"errors.sync_toolbar.show_items" = "Mostra elementi"; +"errors.sync_toolbar.forbidden" = "Nome utente o password non validi"; +"errors.sync_toolbar.forbidden_message" = "Il server di sincronizzazione di Zotero non ha accettato il nome utente e la password.\n\nSi prega di disconnettersi e effettuare un nuovo accesso con le credenziali corrette."; +"errors.sync_toolbar.webdav_request_failed" = "Il server WebDAV ha riportato un errore HTTP %d per una richiesta %@."; +"errors.items.loading" = "Impossibile caricare gli elementi"; +"errors.items.deletion" = "Impossibile eliminare l'elemento"; +"errors.items.deletion_from_collection" = "Impossibile rimuovere l'elemento dalla collezione"; +"errors.items.add_to_collection" = "Impossibile aggiungere l'elemento alla collezione"; +"errors.items.move_item" = "Impossibile spostare l'elemento"; +"errors.items.save_note" = "Impossibile salvare la nota"; +"errors.items.add_attachment" = "Impossibile aggiungere l'allegato"; +"errors.items.add_some_attachments" = "Alcuni allegati non sono stati aggiunti: %@"; +"errors.items.load_duplication" = "Impossibile caricare l'elemento da duplicare"; +"errors.items.generating_bib" = "Impossibile generare la bibliografia"; +"errors.citation_preview" = "Impossibile generare l'anteprima della citazione"; +"errors.item_detail.dropped_fields_title" = "Cambia tipo di elemento"; +"errors.item_detail.dropped_fields_message" = "Vuoi cambiare il tipo di elemento?\n\nI seguenti campi verranno persi:\n\n%@"; +"errors.item_detail.cant_load_data" = "Impossibile caricare i dati. Si prega di riprovare."; +"errors.item_detail.cant_create_attachments_with_names" = "Impossibile creare gli allegati: %@"; +"errors.item_detail.cant_create_attachments" = "Impossibile creare gli allegati"; +"errors.item_detail.cant_save_note" = "Impossibile salvare la nota"; +"errors.item_detail.cant_save_changes" = "Impossibile salvare le modifiche"; +"errors.item_detail.cant_trash_item" = "Impossibile spostare l'elemento nel cestino"; +"errors.item_detail.cant_save_tags" = "Impossibile salvare i tag"; +"errors.item_detail.unsupported_type" = "Elemento \"%@\" non supportato"; +"errors.settings.storage" = "Impossibile recuperare i dati di archiviazione"; +"errors.settings.webdav.file_missing_after_upload" = "È stato riscontrato un potenziale problema con il server WebDAV.\n\nUn file caricato, non era immediatamente disponibile per il download. Ci può essere un breve ritardo tra il caricamento dei files e il momento in cui diventano disponibili, in particolare usando un servizio di cloud storage.\n\nSe la sincronizzazione di Zotero sembra funzionare normalmente, puoi ignorare questo messaggio. Se riscontri dei problemi, ti preghiamo di segnalarlo nei forum di Zotero."; +"errors.settings.webdav.invalid_url" = "Errore di verifica WebDAV"; +"errors.settings.webdav.no_password" = "Errore di verifica WebDAV"; +"errors.settings.webdav.no_url" = "Errore di verifica WebDAV"; +"errors.settings.webdav.no_username" = "Errore di verifica WebDAV"; +"errors.settings.webdav.non_existent_file_not_missing" = "Errore di verifica WebDAV"; +"errors.settings.webdav.not_dav" = "L'URL non è un WebDAV valido"; +"errors.settings.webdav.parent_dir_not_found" = "Errore di verifica WebDAV"; +"errors.settings.webdav.zotero_dir_not_found" = "Errore di verifica WebDAV"; +"errors.settings.webdav.unauthorized" = "Il server WebDAV non ha accettato il nome utente e la password inseriti."; +"errors.settings.webdav.forbidden" = "Non hai il permesso di accedere alla cartella indicata sul server WebDAV."; +"errors.settings.webdav.internet_connection" = "Impossibile connettersi alla rete. Si prega di riprovare."; +"errors.settings.webdav.host_not_found" = "Impossibile connettersi al server WebDAV"; +"errors.settings.webdav.ats" = "A causa delle restrizioni di iOS, devi usare HTTPS per connetterti a un server WebDAV non locale."; +"errors.shareext.logged_out" = "Si prega di autenticarsi nell'applicazione prima di usare questa estensione."; +"errors.shareext.cant_load_data" = "Impossibile caricare i dati. Si prega di riprovare."; +"errors.shareext.unknown" = "Errore sconosciuto."; +"errors.shareext.cant_load_schema" = "Errore. Si prega di aprire l'app Zotero, sincronizzare e riprovare."; +"errors.shareext.download_failed" = "Impossibile scaricare il file"; +"errors.shareext.items_not_found" = "Nessun elemento trovato nella pagina"; +"errors.shareext.schema_error" = "Alcuni dati non possono essere scaricati. Potrebbero essere stati salvati con una versione più nuova di Zotero."; +"errors.shareext.translation_failed" = "Salvataggio non riuscito"; +"errors.shareext.response_missing_data" = "Errore. Si prega di riprovare."; +"errors.shareext.failed_additional" = "Puoi comunque salvare questa pagina come un elemento pagina web."; +"errors.shareext.file_not_pdf" = "Impossibile salvare il PDF"; +"errors.shareext.api_error" = "Errore nel caricamento dell'elemento. L'elemento è stato salvato nella tua biblioteca locale."; +"errors.shareext.webdav_error" = "Errore nel caricamento dell'allegato nel server WebDAV"; +"errors.shareext.personal_quota_reached" = "Hai raggiunto il limite dello spazio di archiviazione di Zotero e il file non può essere caricato. Consulta le impostazioni del tuo account per aumentare lo spazio a disposizione.\n\nIl file è stato salvato nella tua biblioteca locale."; +"errors.shareext.group_quota_reached" = "Il gruppo “%@” ha raggiunto la quota massima dello spazio di archiviazione di Zotero e il file non può essere caricato. Il proprietario del gruppo può consultare le impostazioni del proprio account per aumentare lo spazio di archiviazione.\n\nIl file è stato salvato nella biblioteca locale."; +"errors.shareext.forbidden" = "Non hai le autorizzazioni necessarie per aggiungere questo elemento a %@."; +"errors.shareext.webdav_not_verified" = "Errore di verifica WebDAV"; +"errors.shareext.requires_browser" = "Questo contenuto deve essere caricato in un browser per poterlo condividere con Zotero. Aprilo nel tuo browser e usa il pulsante Condividi."; +"errors.db_failure" = "Errore nella creazione del database. Prova ad autenticarti nuovamente."; +"errors.logging.title" = "Errore di debug"; +"errors.logging.start" = "Impossibile iniziare la registrazione di debug"; +"errors.logging.no_logs_recorded" = "Nessun output di debug si è verificato durante la registrazione"; +"errors.logging.upload" = "Impossibile caricare i dati registrati. Si prega di riprovare."; +"errors.logging.response_parsing" = "Risposta inaspettata dal server"; +"errors.translators.bundle_loading" = "Impossibile aggiornare i traduttori. Vuoi riprovare?"; +"errors.styles.addition" = "Impossibile aggiungere lo stile “%@”"; +"errors.styles.deletion" = "Impossibile eliminare lo stile “%@”"; +"errors.styles.loading" = "Impossibile caricare gli stili"; +"errors.styles_search.loading" = "Impossibile caricare gli stili. Vuoi riprovare?"; +"errors.citation.generate_citation" = "Impossibile generare la citazione"; +"errors.citation.generate_bibliography" = "Impossibile generare la bibliografia"; +"errors.citation.invalid_types" = "Selezionati tipi di elementi non validi"; +"errors.citation.missing_style" = "Nessun stile citazionale selezionato. Vai in Impostazioni → Copia veloce e seleziona uno stile."; +"errors.citation.open_settings" = "Apri impostazioni"; +"errors.lookup.no_identifiers_and_no_lookup_data" = "Zotero non è in grado di individuare alcun identificatore tra i dati inseriti. Si prega di verificare i dati inseriti e riprovare."; +"errors.lookup.no_identifiers_with_lookup_data" = "Zotero non è in grado di individuare alcun nuovo identificatore tra i dati inseriti oppure il processo è ancora in corso. Si prega di verificare i dati inseriti e riprovare."; +"errors.pdf.merge_too_big_title" = "Impossibile unire le annotazioni"; +"errors.pdf.merge_too_big" = "L'annotazione combinata sarebbe troppo grande."; +"errors.pdf.cant_update_annotation" = "Impossibile aggiornare l'annotazione"; +"errors.pdf.cant_add_annotations" = "Impossibile aggiungere annotazioni"; +"errors.pdf.cant_delete_annotations" = "Impossibile eliminare annotazioni"; +"errors.pdf.incompatible_document" = "Questo documento non è supportato."; +"errors.pdf.empty_document" = "Questo documento è vuoto."; +"errors.pdf.page_index_not_int" = "Salvato un formato di pagina non corretto per questo documento"; +"errors.pdf.document_changed" = "Questo documento è stato modificato su un altro dispositivo. Si prega di ri-aprirlo per continuare la modifica."; -"accessibility.untitled" = "Title"; -"accessibility.locked" = "Locked"; -"accessibility.archived" = "Archived"; -"accessibility.collections.items" = "items"; -"accessibility.collections.expand" = "Expand"; -"accessibility.collections.collapse" = "Collapse"; -"accessibility.collections.create_collection" = "Create collection"; -"accessibility.collections.search_collections" = "Search collections"; -"accessibility.collections.expand_all_collections" = "Expand all collections"; -"accessibility.items.open_item" = "Open item info"; -"accessibility.items.select_items" = "Select items"; -"accessibility.items.select_all_items" = "Select All Items"; -"accessibility.items.deselect_all_items" = "Deselect All Items"; -"accessibility.items.filter_items" = "Filter items"; -"accessibility.items.sort_items" = "Sort items"; -"accessibility.items.add_to_collection" = "Add selected items to collection"; -"accessibility.items.remove_from_collection" = "Remove selected items from collection"; -"accessibility.items.trash" = "Move selected items to trash"; -"accessibility.items.delete" = "Delete selected items"; -"accessibility.items.restore" = "Restore selected items"; -"accessibility.items.duplicate" = "Duplicate selected item"; -"accessibility.items.share" = "Share selected items"; -"accessibility.items.download_attachments" = "Download attachments for selected items"; -"accessibility.items.remove_downloads" = "Remove downloads for selected items"; -"accessibility.items.collection" = "Collection"; -"accessibility.item_detail.download_and_open" = "Double-tap to download and open"; -"accessibility.item_detail.open" = "Double-tap to open"; -"accessibility.pdf.sidebar_open" = "Open sidebar"; -"accessibility.pdf.sidebar_close" = "Close sidebar"; -"accessibility.pdf.share" = "Share PDF"; -"accessibility.pdf.export" = "Export PDF"; -"accessibility.pdf.export_annotated" = "Export annotated PDF"; -"accessibility.pdf.settings" = "Settings"; -"accessibility.pdf.color_picker" = "Color picker"; -"accessibility.pdf.highlight_annotation_tool" = "Create highlight annotation"; -"accessibility.pdf.note_annotation_tool" = "Create note annotation"; -"accessibility.pdf.image_annotation_tool" = "Create image annotation"; -"accessibility.pdf.ink_annotation_tool" = "Create ink annotation"; -"accessibility.pdf.underline_annotation_tool" = "Create underline annotation"; -"accessibility.pdf.text_annotation_tool" = "Create text annotation"; -"accessibility.pdf.eraser_annotation_tool" = "Eraser"; -"accessibility.pdf.highlight_annotation" = "Highlight annotation"; -"accessibility.pdf.note_annotation" = "Note annotation"; -"accessibility.pdf.image_annotation" = "Image annotation"; -"accessibility.pdf.ink_annotation" = "Ink annotation"; -"accessibility.pdf.underline_annotation" = "Underline annotation"; -"accessibility.pdf.text_annotation" = "Text annotation"; -"accessibility.pdf.edit_annotation" = "Edit annotation"; -"accessibility.pdf.share_annotation" = "Share annotation"; -"accessibility.pdf.share_annotation_image" = "Share annotation image"; -"accessibility.pdf.eraser_annotation" = "Eraser"; -"accessibility.pdf.highlighted_text" = "Highlighted text"; -"accessibility.pdf.underlined_text" = "Underlined text"; -"accessibility.pdf.author" = "Author"; -"accessibility.pdf.comment" = "Comment"; -"accessibility.pdf.tags" = "Tags"; -"accessibility.pdf.annotation_hint" = "Double-tap to select and edit"; -"accessibility.pdf.tags_hint" = "Double-tap to edit tags"; -"accessibility.pdf.selected" = "Selected"; -"accessibility.pdf.search_pdf" = "Search PDF"; -"accessibility.pdf.redo" = "Redo"; -"accessibility.pdf.undo" = "Undo"; -"accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; -"accessibility.pdf.show_more_tools" = "Show more"; -"accessibility.htmlepub.search_html" = "Search Website"; -"accessibility.htmlepub.search_epub" = "Search EPUB"; -"accessibility.speech.play" = "Start speaking"; -"accessibility.speech.pause" = "Pause speaking"; -"accessibility.speech.forward" = "Skip forward"; -"accessibility.speech.backward" = "Skip backward"; -"accessibility.speech.title" = "Read Aloud"; -"accessibility.show_reader" = "Reading Mode"; -"accessibility.show_reader_accessibility_label" = "Switch to reading mode"; -"accessibility.show_speech" = "Read Aloud"; -"accessibility.show_speech_accessibility_label" = "Start reading aloud"; -"accessibility.open_document_accessibility" = "Open accessibility options"; +"accessibility.untitled" = "Titolo"; +"accessibility.locked" = "Bloccato"; +"accessibility.archived" = "Archiviato"; +"accessibility.collections.items" = "elementi"; +"accessibility.collections.expand" = "Espandi"; +"accessibility.collections.collapse" = "Comprimi"; +"accessibility.collections.create_collection" = "Crea collezione"; +"accessibility.collections.search_collections" = "Cerca collezioni"; +"accessibility.collections.expand_all_collections" = "Espandi tutte le collezioni"; +"accessibility.items.open_item" = "Apri le informazioni sull'elemento"; +"accessibility.items.select_items" = "Seleziona elementi"; +"accessibility.items.select_all_items" = "Seleziona tutti gli elementi"; +"accessibility.items.deselect_all_items" = "Deseleziona tutti gli elementi"; +"accessibility.items.filter_items" = "Filtra elementi"; +"accessibility.items.sort_items" = "Ordina elementi"; +"accessibility.items.add_to_collection" = "Aggiungi gli elementi selezionati alla collezione"; +"accessibility.items.remove_from_collection" = "Rimuovi gli elementi selezionati dalla collezione"; +"accessibility.items.trash" = "Sposta gli elementi selezionati nel cestino"; +"accessibility.items.delete" = "Elimina gli elementi selezionati"; +"accessibility.items.restore" = "Ripristina gli elementi selezionati"; +"accessibility.items.duplicate" = "Duplica l'elemento selezionato"; +"accessibility.items.share" = "Condividi gli elementi selezionati"; +"accessibility.items.download_attachments" = "Scarica allegati degli elementi selezionati"; +"accessibility.items.remove_downloads" = "Rimuovi i download per gli elementi selezionati"; +"accessibility.items.collection" = "Collezione"; +"accessibility.item_detail.download_and_open" = "Doppio-tocco per scaricare e aprire"; +"accessibility.item_detail.open" = "Doppio-tocco per aprire"; +"accessibility.pdf.sidebar_open" = "Apri barra laterale"; +"accessibility.pdf.sidebar_close" = "Chiudi barra laterale"; +"accessibility.pdf.share" = "Condividi PDF"; +"accessibility.pdf.export" = "Esporta PDF"; +"accessibility.pdf.export_annotated" = "Esporta PDF con annotazioni"; +"accessibility.pdf.settings" = "Impostazioni"; +"accessibility.pdf.color_picker" = "Scelta colore"; +"accessibility.pdf.highlight_annotation_tool" = "Crea annotazione: evidenziatura"; +"accessibility.pdf.note_annotation_tool" = "Crea annotazione: nota"; +"accessibility.pdf.image_annotation_tool" = "Crea annotazione: immagine"; +"accessibility.pdf.ink_annotation_tool" = "Crea annotazione: scrittura a mano libera"; +"accessibility.pdf.underline_annotation_tool" = "Crea annotazione: sottolineatura"; +"accessibility.pdf.text_annotation_tool" = "Crea annotazione: testo"; +"accessibility.pdf.eraser_annotation_tool" = "Gomma"; +"accessibility.pdf.highlight_annotation" = "Annotazione: evidenziatura"; +"accessibility.pdf.note_annotation" = "Annotazione: nota"; +"accessibility.pdf.image_annotation" = "Annotazione: immagine"; +"accessibility.pdf.ink_annotation" = "Annotazione: scrittura a mano libera"; +"accessibility.pdf.underline_annotation" = "Annotazione: sottolineatura"; +"accessibility.pdf.text_annotation" = "Annotazione: testo"; +"accessibility.pdf.edit_annotation" = "Modifica annotazione"; +"accessibility.pdf.share_annotation" = "Condividi annotazione"; +"accessibility.pdf.share_annotation_image" = "Condividi immagine dell'annotazione"; +"accessibility.pdf.eraser_annotation" = "Gomma"; +"accessibility.pdf.highlighted_text" = "Testo evidenziato"; +"accessibility.pdf.underlined_text" = "Testo sottolineato"; +"accessibility.pdf.author" = "Autore"; +"accessibility.pdf.comment" = "Commento"; +"accessibility.pdf.tags" = "Tag"; +"accessibility.pdf.annotation_hint" = "Doppio-tocco per selezionare e modificare"; +"accessibility.pdf.tags_hint" = "Doppio-tocco per modificare i tag"; +"accessibility.pdf.selected" = "Selezionato"; +"accessibility.pdf.search_pdf" = "Cerca nel PDF"; +"accessibility.pdf.redo" = "Ripeti"; +"accessibility.pdf.undo" = "Annulla"; +"accessibility.pdf.toggle_annotation_toolbar" = "Apri/Chiudi barra degli strumenti dell'annotazione"; +"accessibility.pdf.show_more_tools" = "Mostra di più"; +"accessibility.htmlepub.search_html" = "Cerca sito web"; +"accessibility.htmlepub.search_epub" = "Cerca EPUB"; +"accessibility.speech.play" = "Inizia lettura vocale"; +"accessibility.speech.pause" = "Interrompi lettura vocale"; +"accessibility.speech.forward" = "Passa avanti"; +"accessibility.speech.backward" = "Passa indietro"; +"accessibility.speech.title" = "Lettura vocale"; +"accessibility.show_reader" = "Modalità lettura"; +"accessibility.show_reader_accessibility_label" = "Passa a modalità lettura"; +"accessibility.show_speech" = "Lettura vocale"; +"accessibility.show_speech_accessibility_label" = "Inizia lettura vocale"; +"accessibility.open_document_accessibility" = "Apri opzioni di accessibilità"; From 6f2f9aef3bf69bba1a1f4edf04768013699a6bb3 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Mon, 12 Jan 2026 13:22:45 -0500 Subject: [PATCH 57/75] Add English strings for missing strings in Localizable.stringsdict https://github.com/zotero/zotero-ios/pull/1226#issuecomment-3739634173 Requires using `--mode sourceastranslation` --- .../Assets/af.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/am.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ar.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ast.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/bg.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/bn.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/br.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ca.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/cs.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/cy.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/da.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/de.lproj/Localizable.stringsdict | 121 +++++++++++++++ .../Assets/el.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/et.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/eu.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/fa.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/fi.lproj/Localizable.stringsdict | 77 ++++++++++ .../Assets/gl.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/he.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/hr.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/hu.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/hy.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/id.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ig.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/is.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ja.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/jv.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ka.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/kk.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/km.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/kn.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ko.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/lt.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/mk.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/mn.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../nb-NO.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/nl.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../nn-NO.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/oc.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/pl.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../pt-BR.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../pt-PT.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ro.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ru.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/sk.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/sl.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/sr.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/sv.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/ta.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/th.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/tr.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/uk.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../Assets/vi.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../yue-Hans.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ .../zh-Hans.lproj/Localizable.stringsdict | 11 ++ .../zh-Hant.lproj/Localizable.stringsdict | 143 ++++++++++++++++++ 56 files changed, 7788 insertions(+) diff --git a/Zotero/Assets/af.lproj/Localizable.stringsdict b/Zotero/Assets/af.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/af.lproj/Localizable.stringsdict +++ b/Zotero/Assets/af.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/am.lproj/Localizable.stringsdict b/Zotero/Assets/am.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/am.lproj/Localizable.stringsdict +++ b/Zotero/Assets/am.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ar.lproj/Localizable.stringsdict b/Zotero/Assets/ar.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ar.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ar.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ast.lproj/Localizable.stringsdict b/Zotero/Assets/ast.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ast.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ast.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/bg.lproj/Localizable.stringsdict b/Zotero/Assets/bg.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/bg.lproj/Localizable.stringsdict +++ b/Zotero/Assets/bg.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/bn.lproj/Localizable.stringsdict b/Zotero/Assets/bn.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/bn.lproj/Localizable.stringsdict +++ b/Zotero/Assets/bn.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/br.lproj/Localizable.stringsdict b/Zotero/Assets/br.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/br.lproj/Localizable.stringsdict +++ b/Zotero/Assets/br.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ca.lproj/Localizable.stringsdict b/Zotero/Assets/ca.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ca.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ca.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/cs.lproj/Localizable.stringsdict b/Zotero/Assets/cs.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/cs.lproj/Localizable.stringsdict +++ b/Zotero/Assets/cs.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/cy.lproj/Localizable.stringsdict b/Zotero/Assets/cy.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/cy.lproj/Localizable.stringsdict +++ b/Zotero/Assets/cy.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/da.lproj/Localizable.stringsdict b/Zotero/Assets/da.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/da.lproj/Localizable.stringsdict +++ b/Zotero/Assets/da.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/de.lproj/Localizable.stringsdict b/Zotero/Assets/de.lproj/Localizable.stringsdict index e8240d494..f29d8cd55 100644 --- a/Zotero/Assets/de.lproj/Localizable.stringsdict +++ b/Zotero/Assets/de.lproj/Localizable.stringsdict @@ -37,56 +37,177 @@ NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/el.lproj/Localizable.stringsdict b/Zotero/Assets/el.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/el.lproj/Localizable.stringsdict +++ b/Zotero/Assets/el.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/et.lproj/Localizable.stringsdict b/Zotero/Assets/et.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/et.lproj/Localizable.stringsdict +++ b/Zotero/Assets/et.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/eu.lproj/Localizable.stringsdict b/Zotero/Assets/eu.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/eu.lproj/Localizable.stringsdict +++ b/Zotero/Assets/eu.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/fa.lproj/Localizable.stringsdict b/Zotero/Assets/fa.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/fa.lproj/Localizable.stringsdict +++ b/Zotero/Assets/fa.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/fi.lproj/Localizable.stringsdict b/Zotero/Assets/fi.lproj/Localizable.stringsdict index ed68e6aeb..262ed7055 100644 --- a/Zotero/Assets/fi.lproj/Localizable.stringsdict +++ b/Zotero/Assets/fi.lproj/Localizable.stringsdict @@ -53,6 +53,17 @@ NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches @@ -74,6 +85,17 @@ NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors @@ -111,26 +133,81 @@ NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/gl.lproj/Localizable.stringsdict b/Zotero/Assets/gl.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/gl.lproj/Localizable.stringsdict +++ b/Zotero/Assets/gl.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/he.lproj/Localizable.stringsdict b/Zotero/Assets/he.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/he.lproj/Localizable.stringsdict +++ b/Zotero/Assets/he.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/hr.lproj/Localizable.stringsdict b/Zotero/Assets/hr.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/hr.lproj/Localizable.stringsdict +++ b/Zotero/Assets/hr.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/hu.lproj/Localizable.stringsdict b/Zotero/Assets/hu.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/hu.lproj/Localizable.stringsdict +++ b/Zotero/Assets/hu.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/hy.lproj/Localizable.stringsdict b/Zotero/Assets/hy.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/hy.lproj/Localizable.stringsdict +++ b/Zotero/Assets/hy.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/id.lproj/Localizable.stringsdict b/Zotero/Assets/id.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/id.lproj/Localizable.stringsdict +++ b/Zotero/Assets/id.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ig.lproj/Localizable.stringsdict b/Zotero/Assets/ig.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ig.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ig.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/is.lproj/Localizable.stringsdict b/Zotero/Assets/is.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/is.lproj/Localizable.stringsdict +++ b/Zotero/Assets/is.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ja.lproj/Localizable.stringsdict b/Zotero/Assets/ja.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ja.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ja.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/jv.lproj/Localizable.stringsdict b/Zotero/Assets/jv.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/jv.lproj/Localizable.stringsdict +++ b/Zotero/Assets/jv.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ka.lproj/Localizable.stringsdict b/Zotero/Assets/ka.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ka.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ka.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/kk.lproj/Localizable.stringsdict b/Zotero/Assets/kk.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/kk.lproj/Localizable.stringsdict +++ b/Zotero/Assets/kk.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/km.lproj/Localizable.stringsdict b/Zotero/Assets/km.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/km.lproj/Localizable.stringsdict +++ b/Zotero/Assets/km.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/kn.lproj/Localizable.stringsdict b/Zotero/Assets/kn.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/kn.lproj/Localizable.stringsdict +++ b/Zotero/Assets/kn.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ko.lproj/Localizable.stringsdict b/Zotero/Assets/ko.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ko.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ko.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/lt.lproj/Localizable.stringsdict b/Zotero/Assets/lt.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/lt.lproj/Localizable.stringsdict +++ b/Zotero/Assets/lt.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/mk.lproj/Localizable.stringsdict b/Zotero/Assets/mk.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/mk.lproj/Localizable.stringsdict +++ b/Zotero/Assets/mk.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/mn.lproj/Localizable.stringsdict b/Zotero/Assets/mn.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/mn.lproj/Localizable.stringsdict +++ b/Zotero/Assets/mn.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict b/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict +++ b/Zotero/Assets/nb-NO.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/nl.lproj/Localizable.stringsdict b/Zotero/Assets/nl.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/nl.lproj/Localizable.stringsdict +++ b/Zotero/Assets/nl.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict b/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict +++ b/Zotero/Assets/nn-NO.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/oc.lproj/Localizable.stringsdict b/Zotero/Assets/oc.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/oc.lproj/Localizable.stringsdict +++ b/Zotero/Assets/oc.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/pl.lproj/Localizable.stringsdict b/Zotero/Assets/pl.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/pl.lproj/Localizable.stringsdict +++ b/Zotero/Assets/pl.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict b/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict +++ b/Zotero/Assets/pt-BR.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict b/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict +++ b/Zotero/Assets/pt-PT.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ro.lproj/Localizable.stringsdict b/Zotero/Assets/ro.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ro.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ro.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ru.lproj/Localizable.stringsdict b/Zotero/Assets/ru.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ru.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ru.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/sk.lproj/Localizable.stringsdict b/Zotero/Assets/sk.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/sk.lproj/Localizable.stringsdict +++ b/Zotero/Assets/sk.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/sl.lproj/Localizable.stringsdict b/Zotero/Assets/sl.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/sl.lproj/Localizable.stringsdict +++ b/Zotero/Assets/sl.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/sr.lproj/Localizable.stringsdict b/Zotero/Assets/sr.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/sr.lproj/Localizable.stringsdict +++ b/Zotero/Assets/sr.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/sv.lproj/Localizable.stringsdict b/Zotero/Assets/sv.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/sv.lproj/Localizable.stringsdict +++ b/Zotero/Assets/sv.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/ta.lproj/Localizable.stringsdict b/Zotero/Assets/ta.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/ta.lproj/Localizable.stringsdict +++ b/Zotero/Assets/ta.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/th.lproj/Localizable.stringsdict b/Zotero/Assets/th.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/th.lproj/Localizable.stringsdict +++ b/Zotero/Assets/th.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/tr.lproj/Localizable.stringsdict b/Zotero/Assets/tr.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/tr.lproj/Localizable.stringsdict +++ b/Zotero/Assets/tr.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/uk.lproj/Localizable.stringsdict b/Zotero/Assets/uk.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/uk.lproj/Localizable.stringsdict +++ b/Zotero/Assets/uk.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/vi.lproj/Localizable.stringsdict b/Zotero/Assets/vi.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/vi.lproj/Localizable.stringsdict +++ b/Zotero/Assets/vi.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict b/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict +++ b/Zotero/Assets/yue-Hans.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + diff --git a/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict b/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict index 61cf2bbd9..0e3d29d15 100644 --- a/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict +++ b/Zotero/Assets/zh-Hans.lproj/Localizable.stringsdict @@ -89,6 +89,17 @@ NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected diff --git a/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict b/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict index eb2a525b7..f6d56afb8 100644 --- a/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict +++ b/Zotero/Assets/zh-Hant.lproj/Localizable.stringsdict @@ -5,66 +5,209 @@ NSStringLocalizedFormatKey %#@collections_selected@ + collections_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 Collection Selected + other + %d Collections Selected + items.delete_question NSStringLocalizedFormatKey %#@delete_question@ + delete_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete the selected item? + other + Are you sure you want to delete the selected items? + items.remove_from_collection_question NSStringLocalizedFormatKey %#@remove_from_collection_question@ + remove_from_collection_question + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to remove the selected item from this collection? + other + Are you sure you want to remove the selected items from this collection? + items.toolbar_filter NSStringLocalizedFormatKey %#@toolbar_filter@ + toolbar_filter + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Filter: 1 item + other + Filter: %d items + pdf.search.matches NSStringLocalizedFormatKey %#@matches@ + matches + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Found 1 match + other + Found %d matches + settings.storage.files_size_and_unit NSStringLocalizedFormatKey %#@files@ + files + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 file (%.2f %@) + other + %d files (%.2f %@) + errors.sync_toolbar.errors NSStringLocalizedFormatKey %#@errors@ + errors + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 issue + other + %d issues + tag_picker.tags_selected NSStringLocalizedFormatKey %#@tags_selected@ + tags_selected + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 tag selected + other + %d tags selected + tag_picker.confirm_deletion NSStringLocalizedFormatKey %#@confirm_deletion@ + confirm_deletion + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Are you sure you want to delete 1 automatic tag in this library?\n\nThis action cannot be undone. + other + Are you sure you want to delete %d automatic tags in this library?\n\nThis action cannot be undone. + settings.lines_logged NSStringLocalizedFormatKey %#@lines_logged@ + lines_logged + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line logged + other + %d lines logged + settings.lines NSStringLocalizedFormatKey %#@lines@ + lines + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + 1 line + other + %d lines + errors.sync_toolbar.webdav_error2 NSStringLocalizedFormatKey %#@webdav_error2@ + webdav_error2 + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Could not delete 1 file from your WebDAV server + other + Could not delete %d files from your WebDAV server + settings.general.after_x_days NSStringLocalizedFormatKey %#@after_x_days@ + after_x_days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + After 1 Day + other + After %d Days + From 2c6a74259358ec480cc6548e1e2756e583c6e48d Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 13 Jan 2026 14:16:17 +0200 Subject: [PATCH 58/75] Improve tag filter action handler (#1230) * Use shared tag filter view model * Avoid potential TagFilterActionHandler load exclusivity violation * Improve ItemsFilterCoordinator start * Move shared tag filter view model to main coordinator delegate --- Zotero/Scenes/Detail/DetailCoordinator.swift | 11 ++++- .../Detail/Items/ItemsFilterCoordinator.swift | 17 +++++--- .../Main/Views/MainViewController.swift | 11 +++++ Zotero/Scenes/Master/MasterCoordinator.swift | 9 ++-- .../ViewModels/TagFilterActionHandler.swift | 43 ++++++++++++++----- 5 files changed, 70 insertions(+), 21 deletions(-) diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 46e83eec9..9334f6cc7 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -85,6 +85,7 @@ final class DetailCoordinator: Coordinator { weak var parentCoordinator: Coordinator? var childCoordinators: [Coordinator] private var transitionDelegate: EmptyTransitioningDelegate? + private unowned let mainCoordinatorDelegate: MainCoordinatorDelegate weak var itemsTagFilterDelegate: ItemsTagFilterDelegate? weak var navigationController: UINavigationController? private var tmpAudioDelegate: AVPlayerDelegate? @@ -100,6 +101,7 @@ final class DetailCoordinator: Coordinator { collection: Collection, searchItemKeys: [String]?, navigationController: UINavigationController, + mainCoordinatorDelegate: MainCoordinatorDelegate, itemsTagFilterDelegate: ItemsTagFilterDelegate?, controllers: Controllers ) { @@ -107,6 +109,7 @@ final class DetailCoordinator: Coordinator { self.collection = collection self.searchItemKeys = searchItemKeys self.navigationController = navigationController + self.mainCoordinatorDelegate = mainCoordinatorDelegate self.itemsTagFilterDelegate = itemsTagFilterDelegate self.controllers = controllers self.childCoordinators = [] @@ -672,7 +675,13 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { navigationController.modalPresentationStyle = .popover navigationController.popoverPresentationController?.sourceItem = button - let coordinator = ItemsFilterCoordinator(filters: filters, filtersDelegate: filtersDelegate, navigationController: navigationController, controllers: controllers) + let coordinator = ItemsFilterCoordinator( + filters: filters, + filtersDelegate: filtersDelegate, + navigationController: navigationController, + mainCoordinatorDelegate: mainCoordinatorDelegate, + controllers: controllers + ) coordinator.parentCoordinator = self childCoordinators.append(coordinator) coordinator.start(animated: false) diff --git a/Zotero/Scenes/Detail/Items/ItemsFilterCoordinator.swift b/Zotero/Scenes/Detail/Items/ItemsFilterCoordinator.swift index ba5cba672..6b17b9232 100644 --- a/Zotero/Scenes/Detail/Items/ItemsFilterCoordinator.swift +++ b/Zotero/Scenes/Detail/Items/ItemsFilterCoordinator.swift @@ -26,12 +26,20 @@ final class ItemsFilterCoordinator: NSObject, Coordinator { weak var navigationController: UINavigationController? private let filters: [ItemsFilter] + private unowned let mainCoordinatorDelegate: MainCoordinatorDelegate private unowned let controllers: Controllers private weak var filtersDelegate: BaseItemsViewController? - init(filters: [ItemsFilter], filtersDelegate: BaseItemsViewController, navigationController: NavigationViewController, controllers: Controllers) { + init( + filters: [ItemsFilter], + filtersDelegate: BaseItemsViewController, + navigationController: NavigationViewController, + mainCoordinatorDelegate: MainCoordinatorDelegate, + controllers: Controllers + ) { self.filters = filters self.navigationController = navigationController + self.mainCoordinatorDelegate = mainCoordinatorDelegate self.controllers = controllers self.filtersDelegate = filtersDelegate childCoordinators = [] @@ -45,11 +53,8 @@ final class ItemsFilterCoordinator: NSObject, Coordinator { } func start(animated: Bool) { - guard let dbStorage = controllers.userControllers?.dbStorage else { return } - let tags = filters.compactMap({ $0.tags }).first - let state = TagFilterState(selectedTags: tags ?? [], showAutomatic: Defaults.shared.tagPickerShowAutomaticTags, displayAll: Defaults.shared.tagPickerDisplayAllTags) - let handler = TagFilterActionHandler(dbStorage: dbStorage) - let tagController = TagFilterViewController(viewModel: ViewModel(initialState: state, handler: handler)) + guard let viewModel = mainCoordinatorDelegate.sharedTagFilterViewModel else { return } + let tagController = TagFilterViewController(viewModel: viewModel) tagController.view.translatesAutoresizingMaskIntoConstraints = false tagController.delegate = filtersDelegate filtersDelegate?.tagFilterDelegate = tagController diff --git a/Zotero/Scenes/Main/Views/MainViewController.swift b/Zotero/Scenes/Main/Views/MainViewController.swift index 7b4057667..66a1e0359 100644 --- a/Zotero/Scenes/Main/Views/MainViewController.swift +++ b/Zotero/Scenes/Main/Views/MainViewController.swift @@ -15,6 +15,8 @@ import CocoaLumberjackSwift import RxSwift protocol MainCoordinatorDelegate: AnyObject { + var sharedTagFilterViewModel: ViewModel? { get } + func showItems(for collection: Collection, in libraryId: LibraryIdentifier) } @@ -44,6 +46,12 @@ final class MainViewController: UISplitViewController { } } private var detailCoordinatorGetter: (libraryId: LibraryIdentifier?, collectionId: CollectionIdentifier?, completion: (DetailCoordinator) -> Void)? + private lazy var tagFilterViewModel: ViewModel? = { + guard let dbStorage = controllers.userControllers?.dbStorage else { return nil } + let state = TagFilterState(selectedTags: [], showAutomatic: Defaults.shared.tagPickerShowAutomaticTags, displayAll: Defaults.shared.tagPickerDisplayAllTags) + let handler = TagFilterActionHandler(dbStorage: dbStorage) + return ViewModel(initialState: state, handler: handler) + }() // MARK: - Lifecycle @@ -119,6 +127,7 @@ final class MainViewController: UISplitViewController { collection: collection, searchItemKeys: searchItemKeys, navigationController: navigationController, + mainCoordinatorDelegate: self, itemsTagFilterDelegate: tagFilterController, controllers: controllers ) @@ -142,6 +151,8 @@ final class MainViewController: UISplitViewController { extension MainViewController: UISplitViewControllerDelegate { } extension MainViewController: MainCoordinatorDelegate { + var sharedTagFilterViewModel: ViewModel? { tagFilterViewModel } + func showItems(for collection: Collection, in libraryId: LibraryIdentifier) { guard isCollapsed || detailCoordinator?.libraryId != libraryId || detailCoordinator?.collection.identifier != collection.identifier else { return } showItems(for: collection, in: libraryId, searchItemKeys: nil) diff --git a/Zotero/Scenes/Master/MasterCoordinator.swift b/Zotero/Scenes/Master/MasterCoordinator.swift index 34b8edf60..ecc28b2df 100644 --- a/Zotero/Scenes/Master/MasterCoordinator.swift +++ b/Zotero/Scenes/Master/MasterCoordinator.swift @@ -246,6 +246,10 @@ extension MasterCoordinator: MasterLibrariesCoordinatorDelegate { } extension MasterCoordinator: MasterCollectionsCoordinatorDelegate { + var sharedTagFilterViewModel: ViewModel? { + return mainCoordinatorDelegate.sharedTagFilterViewModel + } + func showEditView(for data: CollectionStateEditingData, library: Library) { guard let navigationController else { return } let editNavigationController = UINavigationController() @@ -302,10 +306,7 @@ extension MasterCoordinator: MasterCollectionsCoordinatorDelegate { extension MasterCoordinator: MasterContainerCoordinatorDelegate { func createBottomController() -> DraggableViewController? { - guard UIDevice.current.userInterfaceIdiom == .pad, let dbStorage = controllers.userControllers?.dbStorage else { return nil } - let state = TagFilterState(selectedTags: [], showAutomatic: Defaults.shared.tagPickerShowAutomaticTags, displayAll: Defaults.shared.tagPickerDisplayAllTags) - let handler = TagFilterActionHandler(dbStorage: dbStorage) - let viewModel = ViewModel(initialState: state, handler: handler) + guard UIDevice.current.userInterfaceIdiom == .pad, let viewModel = mainCoordinatorDelegate.sharedTagFilterViewModel else { return nil } return TagFilterViewController(viewModel: viewModel) } } diff --git a/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift b/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift index 7dfcb913c..7a3786011 100644 --- a/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift +++ b/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift @@ -132,13 +132,36 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct } private func load(with filters: [ItemsFilter], collectionId: CollectionIdentifier, libraryId: LibraryIdentifier, in viewModel: ViewModel) { + // Creating local copies of required state properties, so we avoid an exclusivity violation, if the main thread updates the state while the background queue reads it at the same time. + let showAutomatic = viewModel.state.showAutomatic + let selectedTags = viewModel.state.selectedTags + let displayAll = viewModel.state.displayAll + let searchTerm = viewModel.state.searchTerm backgroundQueue.async { [weak viewModel] in guard let viewModel else { return } - _load(with: filters, collectionId: collectionId, libraryId: libraryId, in: viewModel) + _load( + with: filters, + collectionId: collectionId, + libraryId: libraryId, + showAutomatic: showAutomatic, + selectedTags: selectedTags, + displayAll: displayAll, + searchTerm: searchTerm, + in: viewModel + ) } } - private func _load(with filters: [ItemsFilter], collectionId: CollectionIdentifier, libraryId: LibraryIdentifier, in viewModel: ViewModel) { + private func _load( + with filters: [ItemsFilter], + collectionId: CollectionIdentifier, + libraryId: LibraryIdentifier, + showAutomatic: Bool, + selectedTags: Set, + displayAll: Bool, + searchTerm: String, + in viewModel: ViewModel + ) { do { var selected: Set = [] var snapshot: [TagFilterState.FilterTag]? @@ -153,14 +176,14 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct return } let filtered = try coordinator.perform( - request: ReadFilteredTagsDbRequest(collectionId: collectionId, libraryId: libraryId, showAutomatic: viewModel.state.showAutomatic, filters: filters) + request: ReadFilteredTagsDbRequest(collectionId: collectionId, libraryId: libraryId, showAutomatic: showAutomatic, filters: filters) ) let colored = try coordinator.perform(request: ReadColoredTagsDbRequest(libraryId: libraryId)) let emoji = try coordinator.perform(request: ReadEmojiTagsDbRequest(libraryId: libraryId)) // Update selection based on current filter to exclude selected tags which were filtered out by some change. for tag in filtered { - guard viewModel.state.selectedTags.contains(tag.name) else { continue } + guard selectedTags.contains(tag.name) else { continue } selected.insert(tag.name) } @@ -186,7 +209,7 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct sorted.append(contentsOf: sortedEmoji) var sortedOther: [TagFilterState.FilterTag] = [] - if !viewModel.state.displayAll { + if !displayAll { // Add remaining filtered tags, ignore colored for tag in filtered { guard tag.color.isEmpty && tag.emojiGroup == nil else { continue } @@ -196,7 +219,7 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct } } else { // Add all remaining tags with proper isActive flag - let tags = try coordinator.perform(request: ReadFilteredTagsDbRequest(collectionId: .custom(.all), libraryId: libraryId, showAutomatic: viewModel.state.showAutomatic, filters: [])) + let tags = try coordinator.perform(request: ReadFilteredTagsDbRequest(collectionId: .custom(.all), libraryId: libraryId, showAutomatic: showAutomatic, filters: [])) for tag in tags { guard tag.color.isEmpty && tag.emojiGroup == nil else { continue } let isActive = filtered.contains(tag) @@ -209,15 +232,15 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct coordinator.invalidate() - if !viewModel.state.searchTerm.isEmpty { + if !searchTerm.isEmpty { // Perform search filter if needed snapshot = sorted - sorted = sorted.filter({ $0.tag.name.localizedCaseInsensitiveContains(viewModel.state.searchTerm) }) + sorted = sorted.filter({ $0.tag.name.localizedCaseInsensitiveContains(searchTerm) }) } } inMainThread { [weak viewModel] in - guard let viewModel = viewModel else { return } + guard let viewModel else { return } update(viewModel: viewModel) { state in state.tags = sorted state.snapshot = snapshot @@ -227,7 +250,7 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct } } catch let error { inMainThread { [weak viewModel] in - guard let viewModel = viewModel else { return } + guard let viewModel else { return } DDLogError("TagFilterActionHandler: can't load tag: \(error)") update(viewModel: viewModel) { state in state.error = .loadingFailed From 99bc0b35904a61df15cadd8ec9f1b9781ac4680b Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 13 Jan 2026 14:24:22 +0200 Subject: [PATCH 59/75] Improve share extension request cookies (#1229) * Update translators * Add cloudflare clearance cookie in web view handler requests --- .../Web View Handling/WebViewHandler.swift | 57 +++++++++++++------ translators | 2 +- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Zotero/Controllers/Web View Handling/WebViewHandler.swift b/Zotero/Controllers/Web View Handling/WebViewHandler.swift index f4b7e1049..7a5ad802f 100644 --- a/Zotero/Controllers/Web View Handling/WebViewHandler.swift +++ b/Zotero/Controllers/Web View Handling/WebViewHandler.swift @@ -236,33 +236,54 @@ class WebViewHandler: NSObject { DDLogInfo("WebViewHandler: send request to \(url.absoluteString)") - session.set(cookies: cookies, domain: url.host ?? "") + let domain = url.host() ?? "" + session.set(cookies: cookies, domain: domain) var request = URLRequest(url: url) request.httpMethod = method - headers.forEach { key, value in - request.setValue(value, forHTTPHeaderField: key) - } - if headers["User-Agent"] == nil, let userAgent { - request.setValue(userAgent, forHTTPHeaderField: "User-Agent") - } - if headers["Referer"] == nil, let referer, !referer.isEmpty { - request.setValue(referer, forHTTPHeaderField: "Referer") - } request.httpBody = body?.data(using: .utf8) request.timeoutInterval = timeout - let task = session.dataTask(with: request) { [weak self] data, response, error in + addCloudflareCookie(domain: domain, existingHeaders: headers) { [weak self] headers in guard let self else { return } - if let response = response as? HTTPURLResponse { - sendHttpResponse(data: data, statusCode: response.statusCode, url: response.url, successCodes: successCodes, headers: response.allHeaderFields, for: messageId) - } else if let error { - sendHttpResponse(data: error.localizedDescription.data(using: .utf8), statusCode: -1, url: nil, successCodes: successCodes, headers: [:], for: messageId) - } else { - sendHttpResponse(data: "unknown error".data(using: .utf8), statusCode: -1, url: nil, successCodes: successCodes, headers: [:], for: messageId) + headers.forEach { key, value in + request.setValue(value, forHTTPHeaderField: key) + } + if headers["User-Agent"] == nil, let userAgent { + request.setValue(userAgent, forHTTPHeaderField: "User-Agent") + } + if headers["Referer"] == nil, let referer, !referer.isEmpty { + request.setValue(referer, forHTTPHeaderField: "Referer") + } + + let task = session.dataTask(with: request) { [weak self] data, response, error in + guard let self else { return } + if let response = response as? HTTPURLResponse { + sendHttpResponse(data: data, statusCode: response.statusCode, url: response.url, successCodes: successCodes, headers: response.allHeaderFields, for: messageId) + } else if let error { + sendHttpResponse(data: error.localizedDescription.data(using: .utf8), statusCode: -1, url: nil, successCodes: successCodes, headers: [:], for: messageId) + } else { + sendHttpResponse(data: "unknown error".data(using: .utf8), statusCode: -1, url: nil, successCodes: successCodes, headers: [:], for: messageId) + } + } + task.resume() + } + + func addCloudflareCookie(domain: String, existingHeaders: [String: String], completion: @escaping ([String: String]) -> Void) { + guard let webView else { return completion(existingHeaders) } + let store = webView.configuration.websiteDataStore.httpCookieStore + store.getAllCookies { cookies in + let cloudflareCookies = cookies.filter({ $0.name == "cf_clearance" && $0.domain.hasSuffix(domain) }) + guard !cloudflareCookies.isEmpty else { return completion(existingHeaders) } + var cookieString = cloudflareCookies.map({ "\($0.name)=\($0.value)" }).joined(separator: "; ") + var headers = existingHeaders + if let existingCookie = headers["Cookie"], !existingCookie.isEmpty { + cookieString = existingCookie + "; " + cookieString + } + headers["Cookie"] = cookieString + completion(headers) } } - task.resume() } } diff --git a/translators b/translators index 6365ccdf1..9e1d1675b 160000 --- a/translators +++ b/translators @@ -1 +1 @@ -Subproject commit 6365ccdf1360a472ac2dc2a09e0b05c527d676dd +Subproject commit 9e1d1675baa6b57ddf7257122e0d438b00de7282 From f4022fed4339be24b7ea70c270d0d7f36acbdf3e Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 9 Jan 2026 18:58:25 +0200 Subject: [PATCH 60/75] Update schema to version 39 --- bundled/schema.json | 1757 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 1550 insertions(+), 207 deletions(-) diff --git a/bundled/schema.json b/bundled/schema.json index 15df113a8..95be0a843 100644 --- a/bundled/schema.json +++ b/bundled/schema.json @@ -1,5 +1,5 @@ { - "version": 33, + "version": 39, "itemTypes": [ { "itemType": "annotation", @@ -26,10 +26,19 @@ "field": "date" }, { - "field": "language" + "field": "eventPlace" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" + }, + { + "field": "url" + }, + { + "field": "accessDate" }, { "field": "archive" @@ -38,16 +47,16 @@ "field": "archiveLocation" }, { - "field": "libraryCatalog" + "field": "shortTitle" }, { - "field": "callNumber" + "field": "language" }, { - "field": "url" + "field": "libraryCatalog" }, { - "field": "accessDate" + "field": "callNumber" }, { "field": "rights" @@ -103,13 +112,13 @@ { "field": "numberOfVolumes" }, - { - "field": "place" - }, { "field": "label", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "date" }, @@ -117,13 +126,19 @@ "field": "runningTime" }, { - "field": "language" + "field": "ISBN" }, { - "field": "ISBN" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" + }, + { + "field": "url" + }, + { + "field": "accessDate" }, { "field": "archive" @@ -132,16 +147,16 @@ "field": "archiveLocation" }, { - "field": "libraryCatalog" + "field": "shortTitle" }, { - "field": "callNumber" + "field": "language" }, { - "field": "url" + "field": "libraryCatalog" }, { - "field": "accessDate" + "field": "callNumber" }, { "field": "rights" @@ -156,13 +171,19 @@ "primary": true }, { - "creatorType": "contributor" + "creatorType": "originalCreator" }, { "creatorType": "composer" }, { "creatorType": "wordsBy" + }, + { + "creatorType": "translator" + }, + { + "creatorType": "contributor" } ] }, @@ -207,7 +228,10 @@ "field": "date" }, { - "field": "language" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -218,6 +242,9 @@ { "field": "shortTitle" }, + { + "field": "language" + }, { "field": "rights" }, @@ -258,6 +285,12 @@ { "field": "date" }, + { + "field": "DOI" + }, + { + "field": "citationKey" + }, { "field": "url" }, @@ -265,11 +298,14 @@ "field": "accessDate" }, { - "field": "language" + "field": "ISSN" }, { "field": "shortTitle" }, + { + "field": "language" + }, { "field": "rights" }, @@ -282,6 +318,9 @@ "creatorType": "author", "primary": true }, + { + "creatorType": "translator" + }, { "creatorType": "commenter" }, @@ -315,25 +354,38 @@ "field": "edition" }, { - "field": "place" + "field": "date" }, { "field": "publisher" }, { - "field": "date" + "field": "place" }, { - "field": "numPages" + "field": "originalDate" }, { - "field": "language" + "field": "originalPublisher" + }, + { + "field": "originalPlace" + }, + { + "field": "format", + "baseField": "medium" + }, + { + "field": "numPages" }, { "field": "ISBN" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -341,12 +393,21 @@ { "field": "accessDate" }, + { + "field": "ISSN" + }, { "field": "archive" }, { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -408,25 +469,38 @@ "field": "edition" }, { - "field": "place" + "field": "date" }, { "field": "publisher" }, { - "field": "date" + "field": "place" }, { - "field": "pages" + "field": "originalDate" }, { - "field": "language" + "field": "originalPublisher" + }, + { + "field": "originalPlace" + }, + { + "field": "format", + "baseField": "medium" + }, + { + "field": "pages" }, { "field": "ISBN" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -434,12 +508,21 @@ { "field": "accessDate" }, + { + "field": "ISSN" + }, { "field": "archive" }, { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -512,10 +595,10 @@ "field": "history" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -523,6 +606,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -564,27 +653,33 @@ { "field": "system" }, - { - "field": "place" - }, { "field": "company", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "programmingLanguage" }, { - "field": "ISBN" + "field": "rights" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" }, { - "field": "rights" + "field": "accessDate" + }, + { + "field": "DOI" + }, + { + "field": "ISBN" }, { "field": "archive" @@ -599,7 +694,7 @@ "field": "callNumber" }, { - "field": "accessDate" + "field": "shortTitle" }, { "field": "extra" @@ -624,9 +719,6 @@ { "field": "abstractNote" }, - { - "field": "date" - }, { "field": "proceedingsTitle", "baseField": "publicationTitle" @@ -634,11 +726,14 @@ { "field": "conferenceName" }, + { + "field": "publisher" + }, { "field": "place" }, { - "field": "publisher" + "field": "date" }, { "field": "volume" @@ -649,9 +744,6 @@ { "field": "series" }, - { - "field": "language" - }, { "field": "DOI" }, @@ -659,7 +751,7 @@ "field": "ISBN" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -667,12 +759,21 @@ { "field": "accessDate" }, + { + "field": "ISSN" + }, { "field": "archive" }, { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -815,25 +916,25 @@ "field": "edition" }, { - "field": "place" + "field": "date" }, { "field": "publisher" }, { - "field": "date" + "field": "place" }, { "field": "pages" }, { - "field": "language" + "field": "ISBN" }, { - "field": "ISBN" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -847,6 +948,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -889,16 +996,22 @@ "field": "abstractNote" }, { - "field": "publisher" + "field": "type" }, { "field": "date" }, { - "field": "language" + "field": "publisher" }, { - "field": "shortTitle" + "field": "place" + }, + { + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -912,6 +1025,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -958,7 +1077,10 @@ "field": "date" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -966,6 +1088,9 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, { "field": "language" }, @@ -981,6 +1106,9 @@ "creatorType": "author", "primary": true }, + { + "creatorType": "translator" + }, { "creatorType": "contributor" }, @@ -1018,13 +1146,13 @@ "field": "edition" }, { - "field": "place" + "field": "date" }, { "field": "publisher" }, { - "field": "date" + "field": "place" }, { "field": "pages" @@ -1033,16 +1161,16 @@ "field": "ISBN" }, { - "field": "shortTitle" + "field": "DOI" }, { - "field": "url" + "field": "citationKey" }, { - "field": "accessDate" + "field": "url" }, { - "field": "language" + "field": "accessDate" }, { "field": "archive" @@ -1050,6 +1178,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1095,6 +1229,9 @@ "field": "distributor", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "date" }, @@ -1110,10 +1247,10 @@ "field": "runningTime" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -1127,6 +1264,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1146,13 +1289,28 @@ "primary": true }, { - "creatorType": "contributor" + "creatorType": "producer" }, { "creatorType": "scriptwriter" }, { - "creatorType": "producer" + "creatorType": "castMember" + }, + { + "creatorType": "host" + }, + { + "creatorType": "guest" + }, + { + "creatorType": "narrator" + }, + { + "creatorType": "translator" + }, + { + "creatorType": "contributor" } ] }, @@ -1177,10 +1335,10 @@ "field": "date" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -1188,6 +1346,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -1217,9 +1381,6 @@ { "field": "committee" }, - { - "field": "place" - }, { "field": "publisher" }, @@ -1247,10 +1408,13 @@ "field": "date" }, { - "field": "language" + "field": "place" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -1258,6 +1422,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -1285,10 +1455,10 @@ "field": "date" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -1296,6 +1466,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -1325,18 +1501,24 @@ { "field": "abstractNote" }, + { + "field": "interviewMedium", + "baseField": "medium" + }, { "field": "date" }, { - "field": "interviewMedium", - "baseField": "medium" + "field": "publisher" }, { - "field": "language" + "field": "place" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -1350,6 +1532,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1391,6 +1579,15 @@ { "field": "publicationTitle" }, + { + "field": "publisher" + }, + { + "field": "place" + }, + { + "field": "date" + }, { "field": "volume" }, @@ -1398,10 +1595,16 @@ "field": "issue" }, { - "field": "pages" + "field": "section" }, { - "field": "date" + "field": "partNumber" + }, + { + "field": "partTitle" + }, + { + "field": "pages" }, { "field": "series" @@ -1416,22 +1619,25 @@ "field": "journalAbbreviation" }, { - "field": "language" + "field": "DOI" }, { - "field": "DOI" + "field": "citationKey" }, { - "field": "ISSN" + "field": "url" }, { - "field": "shortTitle" + "field": "accessDate" }, { - "field": "url" + "field": "PMID" }, { - "field": "accessDate" + "field": "PMCID" + }, + { + "field": "ISSN" }, { "field": "archive" @@ -1439,6 +1645,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1488,10 +1700,13 @@ "field": "date" }, { - "field": "language" + "field": "eventPlace" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -1505,6 +1720,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1523,11 +1744,14 @@ "creatorType": "author", "primary": true }, + { + "creatorType": "recipient" + }, { "creatorType": "contributor" }, { - "creatorType": "recipient" + "creatorType": "translator" } ] }, @@ -1544,25 +1768,31 @@ "field": "publicationTitle" }, { - "field": "volume" + "field": "publisher" }, { - "field": "issue" + "field": "place" }, { "field": "date" }, { - "field": "pages" + "field": "volume" }, { - "field": "language" + "field": "issue" + }, + { + "field": "pages" }, { "field": "ISSN" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -1576,6 +1806,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1618,6 +1854,10 @@ "field": "manuscriptType", "baseField": "type" }, + { + "field": "institution", + "baseField": "publisher" + }, { "field": "place" }, @@ -1628,10 +1868,13 @@ "field": "numPages" }, { - "field": "language" + "field": "number" }, { - "field": "shortTitle" + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -1645,6 +1888,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1694,22 +1943,22 @@ "field": "edition" }, { - "field": "place" + "field": "publisher" }, { - "field": "publisher" + "field": "place" }, { "field": "date" }, { - "field": "language" + "field": "DOI" }, { "field": "ISBN" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -1723,6 +1972,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1762,14 +2017,23 @@ "field": "publicationTitle" }, { - "field": "place" + "field": "publisher" }, { - "field": "edition" + "field": "place" }, { "field": "date" }, + { + "field": "volume" + }, + { + "field": "issue" + }, + { + "field": "edition" + }, { "field": "section" }, @@ -1777,13 +2041,13 @@ "field": "pages" }, { - "field": "language" + "field": "ISSN" }, { - "field": "shortTitle" + "field": "DOI" }, { - "field": "ISSN" + "field": "citationKey" }, { "field": "url" @@ -1797,6 +2061,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -1873,6 +2143,10 @@ "field": "issueDate", "baseField": "date" }, + { + "field": "priorityDate", + "baseField": "originalDate" + }, { "field": "references" }, @@ -1881,10 +2155,10 @@ "baseField": "status" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -1892,6 +2166,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -1935,9 +2215,21 @@ { "field": "date" }, + { + "field": "publisher" + }, + { + "field": "place" + }, { "field": "runningTime" }, + { + "field": "DOI" + }, + { + "field": "citationKey" + }, { "field": "url" }, @@ -1945,10 +2237,10 @@ "field": "accessDate" }, { - "field": "language" + "field": "shortTitle" }, { - "field": "shortTitle" + "field": "language" }, { "field": "rights" @@ -1963,10 +2255,31 @@ "primary": true }, { - "creatorType": "contributor" + "creatorType": "guest" + }, + { + "creatorType": "producer" + }, + { + "creatorType": "executiveProducer" + }, + { + "creatorType": "seriesCreator" + }, + { + "creatorType": "director" + }, + { + "creatorType": "scriptwriter" + }, + { + "creatorType": "castMember" + }, + { + "creatorType": "translator" }, { - "creatorType": "guest" + "creatorType": "contributor" } ] }, @@ -2075,11 +2388,24 @@ { "field": "date" }, + { + "field": "meetingName" + }, { "field": "place" }, { - "field": "meetingName" + "field": "series" + }, + { + "field": "sessionTitle", + "baseField": "publicationTitle" + }, + { + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -2088,10 +2414,10 @@ "field": "accessDate" }, { - "field": "language" + "field": "shortTitle" }, { - "field": "shortTitle" + "field": "language" }, { "field": "rights" @@ -2105,8 +2431,17 @@ "creatorType": "presenter", "primary": true }, + { + "creatorType": "chair" + }, + { + "creatorType": "organizer" + }, { "creatorType": "contributor" + }, + { + "creatorType": "translator" } ] }, @@ -2131,13 +2466,13 @@ "field": "audioRecordingFormat", "baseField": "medium" }, - { - "field": "place" - }, { "field": "network", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "date" }, @@ -2145,10 +2480,10 @@ "field": "runningTime" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -2162,6 +2497,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -2177,23 +2518,38 @@ ], "creatorTypes": [ { - "creatorType": "director", + "creatorType": "creator", "primary": true }, { - "creatorType": "scriptwriter" + "creatorType": "host" + }, + { + "creatorType": "guest" }, { "creatorType": "producer" }, + { + "creatorType": "executiveProducer" + }, + { + "creatorType": "seriesCreator" + }, + { + "creatorType": "director" + }, + { + "creatorType": "scriptwriter" + }, { "creatorType": "castMember" }, { - "creatorType": "contributor" + "creatorType": "translator" }, { - "creatorType": "guest" + "creatorType": "contributor" } ] }, @@ -2215,26 +2571,32 @@ "baseField": "type" }, { - "field": "seriesTitle" + "field": "institution", + "baseField": "publisher" }, { "field": "place" }, { - "field": "institution", - "baseField": "publisher" + "field": "date" }, { - "field": "date" + "field": "seriesTitle" + }, + { + "field": "seriesNumber" }, { "field": "pages" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "ISBN" + }, + { + "field": "citationKey" }, { "field": "url" @@ -2242,12 +2604,21 @@ { "field": "accessDate" }, + { + "field": "ISSN" + }, { "field": "archive" }, { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -2266,6 +2637,9 @@ "creatorType": "author", "primary": true }, + { + "creatorType": "editor" + }, { "creatorType": "contributor" }, @@ -2401,10 +2775,10 @@ "field": "history" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -2412,6 +2786,12 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "rights" }, @@ -2452,14 +2832,23 @@ { "field": "date" }, + { + "field": "series" + }, + { + "field": "seriesNumber" + }, { "field": "numPages" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "ISBN" + }, + { + "field": "citationKey" }, { "field": "url" @@ -2467,12 +2856,21 @@ { "field": "accessDate" }, + { + "field": "ISSN" + }, { "field": "archive" }, { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -2517,13 +2915,13 @@ "field": "videoRecordingFormat", "baseField": "medium" }, - { - "field": "place" - }, { "field": "network", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "date" }, @@ -2531,10 +2929,10 @@ "field": "runningTime" }, { - "field": "language" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -2548,6 +2946,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -2567,19 +2971,34 @@ "primary": true }, { - "creatorType": "scriptwriter" + "creatorType": "producer" }, { - "creatorType": "producer" + "creatorType": "executiveProducer" + }, + { + "creatorType": "seriesCreator" + }, + { + "creatorType": "scriptwriter" }, { "creatorType": "castMember" }, { - "creatorType": "contributor" + "creatorType": "host" }, { "creatorType": "guest" + }, + { + "creatorType": "narrator" + }, + { + "creatorType": "translator" + }, + { + "creatorType": "contributor" } ] }, @@ -2605,13 +3024,13 @@ { "field": "numberOfVolumes" }, - { - "field": "place" - }, { "field": "studio", "baseField": "publisher" }, + { + "field": "place" + }, { "field": "date" }, @@ -2619,13 +3038,13 @@ "field": "runningTime" }, { - "field": "language" + "field": "ISBN" }, { - "field": "ISBN" + "field": "DOI" }, { - "field": "shortTitle" + "field": "citationKey" }, { "field": "url" @@ -2639,6 +3058,12 @@ { "field": "archiveLocation" }, + { + "field": "shortTitle" + }, + { + "field": "language" + }, { "field": "libraryCatalog" }, @@ -2654,18 +3079,36 @@ ], "creatorTypes": [ { - "creatorType": "director", + "creatorType": "creator", "primary": true }, { - "creatorType": "scriptwriter" + "creatorType": "director" }, { "creatorType": "producer" }, + { + "creatorType": "scriptwriter" + }, + { + "creatorType": "executiveProducer" + }, { "creatorType": "castMember" }, + { + "creatorType": "host" + }, + { + "creatorType": "guest" + }, + { + "creatorType": "narrator" + }, + { + "creatorType": "translator" + }, { "creatorType": "contributor" } @@ -2692,7 +3135,16 @@ "field": "date" }, { - "field": "shortTitle" + "field": "publisher" + }, + { + "field": "place" + }, + { + "field": "DOI" + }, + { + "field": "citationKey" }, { "field": "url" @@ -2700,6 +3152,9 @@ { "field": "accessDate" }, + { + "field": "shortTitle" + }, { "field": "language" }, @@ -2861,6 +3316,9 @@ "chapter-number": [ "session" ], + "citation-key": [ + "citationKey" + ], "collection-number": [ "seriesNumber" ], @@ -2929,9 +3387,21 @@ "number-of-volumes": [ "numberOfVolumes" ], + "part-number": [ + "partNumber" + ], + "part-title": [ + "partTitle" + ], "page": [ "pages" ], + "PMID": [ + "PMID" + ], + "PMCID": [ + "PMCID" + ], "publisher": [ "publisher" ], @@ -2984,16 +3454,25 @@ "names": { "author": "author", "bookAuthor": "container-author", + "chair": "chair", "castMember": "performer", "composer": "composer", "contributor": "contributor", + "creator": "author", "director": "director", "editor": "editor", + "executiveProducer": "executive-producer", "guest": "guest", + "host": "host", "interviewer": "interviewer", + "narrator": "narrator", + "originalCreator": "original-author", + "organizer": "organizer", + "podcaster": "host", "producer": "producer", "recipient": "recipient", "reviewedAuthor": "reviewed-author", + "seriesCreator": "series-creator", "seriesEditor": "collection-editor", "scriptwriter": "script-writer", "translator": "translator" @@ -3084,6 +3563,7 @@ "edition": "Edition", "encyclopediaTitle": "Encyclopedia Title", "episodeNumber": "Episode Number", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Filing Date", "firstPage": "First Page", @@ -3117,11 +3597,19 @@ "numberOfVolumes": "# of Volumes", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pages", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Number", "place": "Place", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Priority Numbers", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Prog. Language", @@ -3145,6 +3633,7 @@ "seriesText": "Series Text", "seriesTitle": "Series Title", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Studio", @@ -3168,17 +3657,24 @@ "bookAuthor": "Book Author", "cartographer": "Cartographer", "castMember": "Cast Member", + "chair": "Chair", "commenter": "Commenter", "composer": "Composer", "contributor": "Contributor", "cosponsor": "Cosponsor", "counsel": "Counsel", + "creator": "Skepper", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Interview With", "interviewer": "Interviewer", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -3187,6 +3683,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Translator", @@ -3195,7 +3692,7 @@ }, "ar": { "itemTypes": { - "annotation": "تعليق", + "annotation": "التعليق التوضيحي", "artwork": "عمل فني", "attachment": "مرفق", "audioRecording": "تسجيل صوتي", @@ -3204,9 +3701,9 @@ "book": "كتاب", "bookSection": "قسم في كتاب", "case": "قضية", - "computerProgram": "Software", + "computerProgram": "البرنامج", "conferencePaper": "ورقة عمل في مؤتمر", - "dataset": "Dataset", + "dataset": "مجموعة البيانات", "dictionaryEntry": "كلمة في المعجم", "document": "مستند", "email": "بريد الكتروني", @@ -3225,7 +3722,7 @@ "note": "ملاحظة", "patent": "براءة الإختراع", "podcast": "تدوينة وسائطية", - "preprint": "Preprint", + "preprint": "ما قبل الطباعة", "presentation": "عرض تقديمي", "radioBroadcast": "بث إذاعي", "report": "تقرير", @@ -3241,20 +3738,20 @@ "accessDate": "تاريخ الدخول", "applicationNumber": "رقم الطلب", "archive": "الارشيف", - "archiveID": "Archive ID", + "archiveID": "معرّف الأرشيف", "archiveLocation": "الموقع في الأرشيف", "artworkMedium": "وسيط العمل الفني", "artworkSize": "حجم العمل الفني", "assignee": "المخول بالمهمة", "audioFileType": "نوع الملف الصوتي", "audioRecordingFormat": "صيغة التسجيل الصوتي", - "authority": "Authority", + "authority": "السلطة", "billNumber": "رقم مسودّة القانون", "blogTitle": "عنوان المدونة", "bookTitle": "عنوان الكتاب", "callNumber": "رقم الإسترجاع", "caseName": "اسم القضية", - "citationKey": "Citation Key", + "citationKey": "مفتاح الاستشهاد", "code": "التشفير", "codeNumber": "رقم الرمز", "codePages": "صفحات القانون", @@ -3273,10 +3770,11 @@ "distributor": "الموزع", "docketNumber": "رقم القضية", "documentNumber": "رقم المستند", - "DOI": "معرف الكائن الرقمي", + "DOI": "DOI", "edition": "الطبعة", "encyclopediaTitle": "عنوان الموسوعة", "episodeNumber": "رقم الموضوع", + "eventPlace": "Event Place", "extra": "معلومات إضافية", "filingDate": "تاريخ الايداع", "firstPage": "الصفحة الأولى", @@ -3284,11 +3782,11 @@ "forumTitle": "عنوان المنتدى", "genre": "النوع الأدبي", "history": "التاريخ", - "identifier": "Identifier", + "identifier": "المعرف", "institution": "المؤسسة", "interviewMedium": "وسيط المقابلة", - "ISBN": "تدمك", - "ISSN": "تدمد", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "العدد", "issueDate": "تاريخ الإصدار", "issuingAuthority": "مسئولية الاصدار", @@ -3309,15 +3807,23 @@ "number": "الرقم", "numberOfVolumes": "عدد المجلدات", "numPages": "عدد الصفحات", - "organization": "Organization", + "organization": "المنظمة", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "الصفحات", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "رقم البرائة", "place": "المكان", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "نوع الموضوع", "presentationType": "نوع العرض التقديمي", + "priorityDate": "Priority Date", "priorityNumbers": "ارقام الأولوية", "proceedingsTitle": "عنوان ورقة العمل", - "programmingLanguage": "Prog. Language", + "programmingLanguage": "لغة البرمجة", "programTitle": "عنوان البرنامج", "publicationTitle": "عنوان المنشور", "publicLawNumber": "رقم القانون العام", @@ -3327,8 +3833,8 @@ "reporterVolume": "مجلد الأحكام", "reportNumber": "رقم التقرير", "reportType": "نوع التقرير", - "repository": "Repository", - "repositoryLocation": "Repo. Location", + "repository": "المستودع", + "repositoryLocation": "موقع المستودع", "rights": "الحقوق", "runningTime": "وقت التشغيل", "scale": "مقياس الرسم", @@ -3338,8 +3844,9 @@ "seriesText": "نص السلسلة", "seriesTitle": "عنوان السلسلة", "session": "الجلسة", + "sessionTitle": "Session Title", "shortTitle": "العنوان المختصر", - "status": "Status", + "status": "الحالة", "studio": "الأستوديو", "subject": "الموضوع", "system": "النظام", @@ -3361,17 +3868,24 @@ "bookAuthor": "مؤلف كتاب", "cartographer": "رسام الخريطة", "castMember": "عضو طاقم التمثيل", + "chair": "Chair", "commenter": "المعلق", "composer": "الملحن", "contributor": "اسم المشارك", "cosponsor": "الراعي المشارك", "counsel": "المستشار", + "creator": "المؤلف", "director": "المخرج", "editor": "المحرر", + "executiveProducer": "Executive Producer", "guest": "الضيف", + "host": "Host", "interviewee": "مقابلة مع", "interviewer": "المحاور", "inventor": "المخترع", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "الفنان", "podcaster": "المدون", "presenter": "المقدم", @@ -3380,6 +3894,7 @@ "recipient": "المتلقي", "reviewedAuthor": "مؤلف مراجع", "scriptwriter": "كاتب الحوار", + "seriesCreator": "Series Creator", "seriesEditor": "محرر السلسلة", "sponsor": "الراعي", "translator": "المترجم", @@ -3470,6 +3985,7 @@ "edition": "Издание", "encyclopediaTitle": "Заглавие на енциклопедия", "episodeNumber": "Номер на епизод", + "eventPlace": "Event Place", "extra": "Допълнителни", "filingDate": "Дата на архивиране", "firstPage": "Първа страница", @@ -3503,11 +4019,19 @@ "numberOfVolumes": "Номера на томовете", "numPages": "брой страници", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Страници", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Номер на патент", "place": "Място", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Вид съобщението", "presentationType": "Вид", + "priorityDate": "Priority Date", "priorityNumbers": "Приоритетни номера", "proceedingsTitle": "Заглавие на протокол", "programmingLanguage": "Prog. Language", @@ -3531,6 +4055,7 @@ "seriesText": "Текст на поредицата", "seriesTitle": "Заглавие на поредицата", "session": "Сесия", + "sessionTitle": "Session Title", "shortTitle": "Късо заглавие", "status": "Status", "studio": "Студио", @@ -3554,17 +4079,24 @@ "bookAuthor": "Автор на книга", "cartographer": "Картограф", "castMember": "Член на Трупата", + "chair": "Chair", "commenter": "Коментатор", "composer": "Композитор", "contributor": "Сътрудник", "cosponsor": "Коспонсор", "counsel": "Адвокат", + "creator": "Създател", "director": "Режисьор", "editor": "Редактор", + "executiveProducer": "Executive Producer", "guest": "Гост", + "host": "Host", "interviewee": "Интервю с", "interviewer": "Интервюиращ", "inventor": "Откривател", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Изпълнител", "podcaster": "Автор на подкаст", "presenter": "Изнесен от", @@ -3573,6 +4105,7 @@ "recipient": "Получател", "reviewedAuthor": "Рецензиран Автор", "scriptwriter": "Сценарист", + "seriesCreator": "Series Creator", "seriesEditor": "Редактор на Поредицата", "sponsor": "Спонсор", "translator": "Преводач", @@ -3663,6 +4196,7 @@ "edition": "Embannadur", "encyclopediaTitle": "Titl hollouiziegezh", "episodeNumber": "Niver ar rann", + "eventPlace": "Event Place", "extra": "Traoù dibarr", "filingDate": "Deiziad leuniadur", "firstPage": "Pajenn gentañ", @@ -3696,11 +4230,19 @@ "numberOfVolumes": "# a levrennoù", "numPages": "# a bajennoù", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pajennoù", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Niver breved", "place": "Lec'h", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Doare embannadenn", "presentationType": "Doare", + "priorityDate": "Priority Date", "priorityNumbers": "Niver priorelezh", "proceedingsTitle": "Titl an aktoù", "programmingLanguage": "Yezh brogrammiñ", @@ -3724,6 +4266,7 @@ "seriesText": "Testenn an dastumad", "seriesTitle": "Titl an dastumad", "session": "Dalc'h", + "sessionTitle": "Session Title", "shortTitle": "Titl berr", "status": "Status", "studio": "Studio", @@ -3747,17 +4290,24 @@ "bookAuthor": "Aozer al levr", "cartographer": "Kartenner", "castMember": "Ezel ar c'homedianeta", + "chair": "Chair", "commenter": "Displeger", "composer": "Kompozer", "contributor": "Kendaoler", "cosponsor": "Ken-sponsor", "counsel": "Kuzulier", + "creator": "Krouer", "director": "Rener", "editor": "Embanner", + "executiveProducer": "Executive Producer", "guest": "Den pedet", + "host": "Host", "interviewee": "Aterset gant", "interviewer": "Aterser", "inventor": "Ijiner", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Jubenner", "podcaster": "Podskigner", "presenter": "Kinniger", @@ -3766,6 +4316,7 @@ "recipient": "Resever", "reviewedAuthor": "Aozer niverennet", "scriptwriter": "Skriver-skriptoù", + "seriesCreator": "Series Creator", "seriesEditor": "Embanner heuliadennoù", "sponsor": "Sponsor", "translator": "Troer", @@ -3856,6 +4407,7 @@ "edition": "Edició", "encyclopediaTitle": "Títol de l'enciclopèdia", "episodeNumber": "Número d'episodi", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Data de presentació", "firstPage": "Primera pàgina", @@ -3889,11 +4441,19 @@ "numberOfVolumes": "Nre. de volums", "numPages": "Nre. de pàgines", "organization": "Organització", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pàgines", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Número de patent", "place": "Lloc", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tipus d'escrit", "presentationType": "Tipus", + "priorityDate": "Priority Date", "priorityNumbers": "Números de prioritat", "proceedingsTitle": "Títol de la ponència", "programmingLanguage": "Llenguatge de prog.", @@ -3917,6 +4477,7 @@ "seriesText": "Text de la sèrie", "seriesTitle": "Títol de la sèrie", "session": "Sessió", + "sessionTitle": "Session Title", "shortTitle": "Títol curt", "status": "Estat", "studio": "Estudi", @@ -3940,17 +4501,24 @@ "bookAuthor": "Autor del llibre", "cartographer": "Cartògraf", "castMember": "Membre del repartiment", + "chair": "Chair", "commenter": "Comentarista", "composer": "Compositor", "contributor": "Col·laborador", "cosponsor": "Copatrocinador", "counsel": "Conseller", + "creator": "Creador", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Convidat", + "host": "Host", "interviewee": "Entrevistat", "interviewer": "Entrevistador", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Intèrpret", "podcaster": "Podcaster", "presenter": "Presentador", @@ -3959,6 +4527,7 @@ "recipient": "Receptor", "reviewedAuthor": "Autor revisat", "scriptwriter": "Guionista", + "seriesCreator": "Series Creator", "seriesEditor": "Editor de la sèrie", "sponsor": "Esponsor", "translator": "Traductor", @@ -4049,6 +4618,7 @@ "edition": "Vydání", "encyclopediaTitle": "Jméno encyklopedie", "episodeNumber": "Číslo epizody", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Datum zápisu", "firstPage": "První strana", @@ -4082,11 +4652,19 @@ "numberOfVolumes": "Počet ročníků", "numPages": "# stran", "organization": "Organizace", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Rozsah", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Číslo patentů", "place": "Místo", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Typ příspěvku", "presentationType": "Typ", + "priorityDate": "Priority Date", "priorityNumbers": "Číslo priority", "proceedingsTitle": "Jméno sborníku", "programmingLanguage": "Prog. jazyk", @@ -4110,6 +4688,7 @@ "seriesText": "Text série", "seriesTitle": "Název série", "session": "Zasedání", + "sessionTitle": "Session Title", "shortTitle": "Krátký název", "status": "Status", "studio": "Studio", @@ -4133,17 +4712,24 @@ "bookAuthor": "Autor knihy", "cartographer": "Kartograf", "castMember": "Člen obsazení", + "chair": "Chair", "commenter": "Komentátor", "composer": "Skladatel", "contributor": "Přispěvatel", "cosponsor": "Spolusponzor", "counsel": "Právní zástupce", + "creator": "Tvůrce", "director": "Režisér", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Host", + "host": "Host", "interviewee": "Rozhovor s", "interviewer": "Tazatel", "inventor": "Vynálezce", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Účinkující", "podcaster": "Autor podcastu", "presenter": "Prezentující", @@ -4152,6 +4738,7 @@ "recipient": "Příjemce", "reviewedAuthor": "Autor revize", "scriptwriter": "Scénárista", + "seriesCreator": "Series Creator", "seriesEditor": "Editor série", "sponsor": "Sponzor", "translator": "Překladatel", @@ -4242,6 +4829,7 @@ "edition": "Udgave", "encyclopediaTitle": "Leksikonets titel", "episodeNumber": "Afsnit nr.", + "eventPlace": "Event Place", "extra": "Ekstra", "filingDate": "Indlemmet d.", "firstPage": "Første side", @@ -4275,11 +4863,19 @@ "numberOfVolumes": "Antal bind", "numPages": "Antal sider", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Sider", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patentnummer", "place": "Sted", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Type (post)", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Prioritetsnumre", "proceedingsTitle": "Titel på proceedings", "programmingLanguage": "Prog. Language", @@ -4303,6 +4899,7 @@ "seriesText": "Serie: suppl. tekst", "seriesTitle": "Serietitel", "session": "Behandlet", + "sessionTitle": "Session Title", "shortTitle": "Forkortet titel", "status": "Status", "studio": "Studie", @@ -4326,17 +4923,24 @@ "bookAuthor": "Bogens forfatter", "cartographer": "Kartograf", "castMember": "Medvirkende", + "chair": "Chair", "commenter": "Kommentator", "composer": "Komponist", "contributor": "Anden bidragyder", "cosponsor": "Medforslagsstiller", "counsel": "Advokat", + "creator": "Ophav", "director": "Instruktør/Ophav", "editor": "Redaktør", + "executiveProducer": "Executive Producer", "guest": "Gæst", + "host": "Host", "interviewee": "Inverview med", "interviewer": "Interviewer", "inventor": "Opfinder", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Udøver", "podcaster": "Ophav til podcast", "presenter": "Forelæser/Ophav", @@ -4345,6 +4949,7 @@ "recipient": "Modtager", "reviewedAuthor": "Anmeldt forfatter", "scriptwriter": "Manuskriptforfatter", + "seriesCreator": "Series Creator", "seriesEditor": "Seriens redaktør", "sponsor": "Forslagsstiller", "translator": "Oversætter", @@ -4361,7 +4966,7 @@ "blogPost": "Blog-Post", "book": "Buch", "bookSection": "Buchteil", - "case": "Fall", + "case": "Gerichtsentscheidung", "computerProgram": "Software", "conferencePaper": "Konferenz-Paper", "dataset": "Datensatz", @@ -4411,7 +5016,7 @@ "blogTitle": "Titel des Blogs", "bookTitle": "Buchtitel", "callNumber": "Signatur", - "caseName": "Name des Falls", + "caseName": "Titel", "citationKey": "Zitierschlüssel", "code": "Code", "codeNumber": "Codenummer", @@ -4424,7 +5029,7 @@ "court": "Gericht", "date": "Datum", "dateAdded": "Hinzugefügt am", - "dateDecided": "Beschlussdatum", + "dateDecided": "Entscheidungsdatum", "dateEnacted": "Datum des Inkrafttretens", "dateModified": "Geändert am", "dictionaryTitle": "Titel des Wörterbuchs", @@ -4435,6 +5040,7 @@ "edition": "Auflage", "encyclopediaTitle": "Titel der Enzyklopädie", "episodeNumber": "Nummer der Folge", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Datum der Einreichung", "firstPage": "Erste Seite", @@ -4468,11 +5074,19 @@ "numberOfVolumes": "Anzahl der Bände", "numPages": "Anzahl der Seiten", "organization": "Organisation", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Seiten", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patentnummer", "place": "Ort", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Art von Eintrag", "presentationType": "Art", + "priorityDate": "Priority Date", "priorityNumbers": "Prioritätsnummern", "proceedingsTitle": "Titel des Konferenzbandes", "programmingLanguage": "Programmiersprache", @@ -4481,8 +5095,8 @@ "publicLawNumber": "Öffentliche Gesetzesnummer", "publisher": "Verlag", "references": "Quellenangaben", - "reporter": "Gesetzessammlung", - "reporterVolume": "Nummer der Gesetzessammlung", + "reporter": "Entscheidungssammlung", + "reporterVolume": "Band", "reportNumber": "Nummer des Berichts", "reportType": "Art von Bericht", "repository": "Repositorium", @@ -4496,6 +5110,7 @@ "seriesText": "Reihe Text", "seriesTitle": "Titel der Reihe", "session": "Sitzung", + "sessionTitle": "Session Title", "shortTitle": "Kurztitel", "status": "Status", "studio": "Studio", @@ -4519,17 +5134,24 @@ "bookAuthor": "Buchautor", "cartographer": "Kartograph", "castMember": "Ensemble", + "chair": "Chair", "commenter": "Kommentator", "composer": "Komponist", "contributor": "Mitarbeiter", "cosponsor": "Mitunterzeichner", "counsel": "Anwalt", + "creator": "Ersteller", "director": "Regisseur", "editor": "Herausgeber", + "executiveProducer": "Executive Producer", "guest": "Gast", + "host": "Host", "interviewee": "Interview mit", "interviewer": "Interviewer", "inventor": "Erfinder", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Darsteller", "podcaster": "Podcaster", "presenter": "Vortragender", @@ -4538,6 +5160,7 @@ "recipient": "Empfänger", "reviewedAuthor": "Rezensierter Autor", "scriptwriter": "Drehbuchautor", + "seriesCreator": "Series Creator", "seriesEditor": "Hrsg. der Reihe", "sponsor": "Sponsor", "translator": "Übersetzer", @@ -4628,6 +5251,7 @@ "edition": "Έκδοση", "encyclopediaTitle": "Τίτλος Εγκυκλοπαίδειας", "episodeNumber": "Αριθμός Επεισοδίου", + "eventPlace": "Event Place", "extra": "Επιπλέον", "filingDate": "Filing Date", "firstPage": "Πρώτη Σελίδα", @@ -4661,11 +5285,19 @@ "numberOfVolumes": "# Τόμων", "numPages": "# από Σελίδες", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Σελίδες", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Αριθμός Ευρεσιτεχνίας", "place": "Τόπος", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Τύπος", + "priorityDate": "Priority Date", "priorityNumbers": "Αριθμοί προτεραιότητας", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Γλώσσα προγραμ.", @@ -4689,6 +5321,7 @@ "seriesText": "Series Text", "seriesTitle": "Τίτλος Σειράς", "session": "Ενότητα", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Στούντιο", @@ -4712,17 +5345,24 @@ "bookAuthor": "Συγγραφέας Βιβλίου", "cartographer": "Χαρτογράφος", "castMember": "Μέλος του καστ", + "chair": "Chair", "commenter": "Σχολιαστής", "composer": "Συνθέτης", "contributor": "Contributor", "cosponsor": "Συντονιστής", "counsel": "Counsel", + "creator": "Δημιουργός", "director": "Σκηνοθέτης", "editor": "Συντάκτης", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Συνέντευξη με", "interviewer": "Δημοσιογράφος", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Ερμηνευτής", "podcaster": "Podcaster", "presenter": "Παρουσιαστής", @@ -4731,6 +5371,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Μετάφραση", @@ -4821,6 +5462,7 @@ "edition": "Edition", "encyclopediaTitle": "Encyclopedia Title", "episodeNumber": "Episode Number", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Filing Date", "firstPage": "First Page", @@ -4854,11 +5496,19 @@ "numberOfVolumes": "# of Volumes", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pages", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Number", "place": "Place", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Priority Numbers", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Prog. Language", @@ -4882,6 +5532,7 @@ "seriesText": "Series Text", "seriesTitle": "Series Title", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Studio", @@ -4905,17 +5556,24 @@ "bookAuthor": "Book Author", "cartographer": "Cartographer", "castMember": "Cast Member", + "chair": "Chair", "commenter": "Commenter", "composer": "Composer", "contributor": "Contributor", "cosponsor": "Cosponsor", "counsel": "Counsel", + "creator": "Creator", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Interview With", "interviewer": "Interviewer", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -4924,6 +5582,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Translator", @@ -5014,6 +5673,7 @@ "edition": "Edition", "encyclopediaTitle": "Encyclopedia Title", "episodeNumber": "Episode Number", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Filing Date", "firstPage": "First Page", @@ -5047,11 +5707,19 @@ "numberOfVolumes": "# of Volumes", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pages", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Number", "place": "Place", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Priority Numbers", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Prog. Language", @@ -5066,7 +5734,7 @@ "reportType": "Report Type", "repository": "Repository", "repositoryLocation": "Repo. Location", - "rights": "Rights", + "rights": "License", "runningTime": "Running Time", "scale": "Scale", "section": "Section", @@ -5075,6 +5743,7 @@ "seriesText": "Series Text", "seriesTitle": "Series Title", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Studio", @@ -5098,17 +5767,24 @@ "bookAuthor": "Book Author", "cartographer": "Cartographer", "castMember": "Cast Member", + "chair": "Chair", "commenter": "Commenter", "composer": "Composer", "contributor": "Contributor", "cosponsor": "Cosponsor", "counsel": "Counsel", + "creator": "Creator", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Interview With", "interviewer": "Interviewer", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -5117,6 +5793,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Translator", @@ -5207,6 +5884,7 @@ "edition": "Edición", "encyclopediaTitle": "Título de la enciclopedia", "episodeNumber": "Número de episodio", + "eventPlace": "Lugar del evento", "extra": "Adicional", "filingDate": "Fecha de solicitud", "firstPage": "Primera página", @@ -5240,11 +5918,19 @@ "numberOfVolumes": "Número de volúmenes", "numPages": "Número de páginas", "organization": "Organización", + "originalDate": "Fecha original", + "originalPlace": "Lugar original", + "originalPublisher": "Editor original", "pages": "Páginas", + "partNumber": "Número de la parte", + "partTitle": "Título de la parte", "patentNumber": "Número de patente", "place": "Lugar", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tipo de mensaje", "presentationType": "Tipo", + "priorityDate": "Fecha de prioridad", "priorityNumbers": "Números de prioridad", "proceedingsTitle": "Título de las actas", "programmingLanguage": "Lenguaje de programación", @@ -5268,6 +5954,7 @@ "seriesText": "Texto de la serie", "seriesTitle": "Título de la serie", "session": "Sesión", + "sessionTitle": "Título de la sesión", "shortTitle": "Título corto", "status": "Estado", "studio": "Estudio", @@ -5291,17 +5978,24 @@ "bookAuthor": "Autor del libro", "cartographer": "Cartógrafo", "castMember": "Miembro del reparto", + "chair": "Moderador", "commenter": "Comentador", "composer": "Compositor", "contributor": "Contribuidor", "cosponsor": "Copatrocinador", "counsel": "Consejero", + "creator": "Creador", "director": "Director", "editor": "Editor", + "executiveProducer": "Productor ejecutivo", "guest": "Invitado", + "host": "Entidad anfitriona", "interviewee": "Entrevista con", "interviewer": "Entrevistador", "inventor": "Inventor", + "narrator": "Narrador", + "organizer": "Organizador", + "originalCreator": "Creador original", "performer": "Intérprete", "podcaster": "Podcaster", "presenter": "Presentador", @@ -5310,6 +6004,7 @@ "recipient": "Receptor", "reviewedAuthor": "Autor revisado", "scriptwriter": "Guionista", + "seriesCreator": "Creador de la serie", "seriesEditor": "Editor de la serie", "sponsor": "Patrocinador", "translator": "Traductor", @@ -5327,9 +6022,9 @@ "book": "Raamat", "bookSection": "Osa raamatust", "case": "Kaasus", - "computerProgram": "Software", + "computerProgram": "Tarkvara", "conferencePaper": "Ettekanne", - "dataset": "Dataset", + "dataset": "Andmestik", "dictionaryEntry": "Kirje sõnaraamatus", "document": "Dokument", "email": "E-mail", @@ -5364,20 +6059,20 @@ "accessDate": "Vaadatud", "applicationNumber": "Taotluse number", "archive": "Arhiiv", - "archiveID": "Archive ID", + "archiveID": "Arhiivi ID", "archiveLocation": "Asukoht arhiivis", "artworkMedium": "Kandja", "artworkSize": "Kunstiteose suurus", "assignee": "Ülesande täitja", "audioFileType": "Faili tüüp", "audioRecordingFormat": "Formaat", - "authority": "Authority", + "authority": "Autor", "billNumber": "Arvenumber", "blogTitle": "Blogi nimi", "bookTitle": "Raamatupealkiri", "callNumber": "Kohaviit", "caseName": "Kaasuse nimi", - "citationKey": "Citation Key", + "citationKey": "Viite võti", "code": "Koodeks", "codeNumber": "Koodeksinumber", "codePages": "Koodeksi leheküljed", @@ -5400,6 +6095,7 @@ "edition": "Trükk", "encyclopediaTitle": "Entsüklopeedia pealkiri", "episodeNumber": "Episoodi number", + "eventPlace": "Event Place", "extra": "Lisa", "filingDate": "Arhiveerimiskuupäev", "firstPage": "Esimene lehekülg", @@ -5407,7 +6103,7 @@ "forumTitle": "Foorumi/Listi pealkir", "genre": "Žanr", "history": "Ajalugu", - "identifier": "Identifier", + "identifier": "Identifikaator", "institution": "Asutus", "interviewMedium": "Kandja", "ISBN": "ISBN", @@ -5432,12 +6128,20 @@ "number": "Number", "numberOfVolumes": "# köidet", "numPages": "# lk", - "organization": "Organization", + "organization": "Organisatsioon", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Leheküljed", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patendi number", "place": "Koht", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Postituse tüüp", "presentationType": "Tüüp", + "priorityDate": "Priority Date", "priorityNumbers": "Prioriteedi numbrid", "proceedingsTitle": "Toimetise pealkiri", "programmingLanguage": "Prog. Language", @@ -5450,7 +6154,7 @@ "reporterVolume": "Raporteerija köide(?)", "reportNumber": "Raportinumber", "reportType": "Raportitüüp", - "repository": "Repository", + "repository": "Teek", "repositoryLocation": "Repo. Location", "rights": "Õigused", "runningTime": "Kestvus", @@ -5461,8 +6165,9 @@ "seriesText": "Seeria tekst", "seriesTitle": "Seeria pealkiri", "session": "Sessioon", + "sessionTitle": "Session Title", "shortTitle": "Lühendatud pealkiri", - "status": "Status", + "status": "Staatus", "studio": "Stuudio", "subject": "Subjekt", "system": "Süsteem", @@ -5484,17 +6189,24 @@ "bookAuthor": "Raamatu autor", "cartographer": "Kartograaf", "castMember": "Osatäitja", + "chair": "Chair", "commenter": "Kommentaator", "composer": "Helilooja", "contributor": "Kaastööline", "cosponsor": "Kaas-sponsor", "counsel": "Nõustaja", + "creator": "Autor", "director": "Režissöör", "editor": "Toimetaja", + "executiveProducer": "Executive Producer", "guest": "Külaline", + "host": "Host", "interviewee": "Intervjueeritav", "interviewer": "Intervjueerija", "inventor": "Leiutaja", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Esitaja", "podcaster": "Podcaster", "presenter": "Esitaja", @@ -5503,6 +6215,7 @@ "recipient": "Saaja", "reviewedAuthor": "Arvustatud autor", "scriptwriter": "Käsikirja autor", + "seriesCreator": "Series Creator", "seriesEditor": "Seeria toimetaja", "sponsor": "Sponsor", "translator": "Tõlkija", @@ -5593,6 +6306,7 @@ "edition": "Edizioa", "encyclopediaTitle": "Entziklopediaren izenburua", "episodeNumber": "Saio zbk.", + "eventPlace": "Event Place", "extra": "Estra", "filingDate": "Noiz aurkeztua", "firstPage": "Lehen orrialdea", @@ -5626,11 +6340,19 @@ "numberOfVolumes": "Ale kopurua", "numPages": "orr.kopurua", "organization": "Erakundea", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Orrialdeak", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patente zenbakia", "place": "Tokia", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Posta mota", "presentationType": "Mota", + "priorityDate": "Priority Date", "priorityNumbers": "Lehentasun zenbakiak", "proceedingsTitle": "Proceedings izenburua", "programmingLanguage": "Prog. lengoaia", @@ -5654,6 +6376,7 @@ "seriesText": "Serie-testua", "seriesTitle": "Serie-izenburua", "session": "Saioa", + "sessionTitle": "Session Title", "shortTitle": "Izenburu laburra", "status": "Egoera", "studio": "Estudioa", @@ -5677,17 +6400,24 @@ "bookAuthor": "Liburuaren autorea", "cartographer": "Kartografialaria", "castMember": "Aktorea", + "chair": "Chair", "commenter": "Esataria", "composer": "Konposatzailea", "contributor": "Kolaboratzaile", "cosponsor": "Laguntzailea", "counsel": "Kontseilua", + "creator": "Sortzailea", "director": "Zuzendaria", "editor": "Editore", + "executiveProducer": "Executive Producer", "guest": "Gonbidatua", + "host": "Host", "interviewee": "Elkarrizketatua", "interviewer": "Elkarrizketatzaile", "inventor": "Asmatzailea", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Antzezlea", "podcaster": "Podcast egilea", "presenter": "Aurkezlea", @@ -5696,6 +6426,7 @@ "recipient": "Hartzailea", "reviewedAuthor": "Berrikusitako autorea", "scriptwriter": "Gidoi-idazle", + "seriesCreator": "Series Creator", "seriesEditor": "Seriearen editore", "sponsor": "Babeslea", "translator": "Itzultzaile", @@ -5782,10 +6513,11 @@ "distributor": "‌توزیع‌کننده", "docketNumber": "شماره دفتر", "documentNumber": "شماره سند", - "DOI": "شناسه DOI", + "DOI": "DOI", "edition": "ویرایش", "encyclopediaTitle": "عنوان دانشنامه", "episodeNumber": "شماره اپیزود", + "eventPlace": "Event Place", "extra": "اطلاعات اضافه", "filingDate": "تاریخ بایگانی", "firstPage": "صفحه اول", @@ -5796,8 +6528,8 @@ "identifier": "Identifier", "institution": "موسسه", "interviewMedium": "رسانه", - "ISBN": "شابک", - "ISSN": "شابن", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "شماره", "issueDate": "تاریخ شماره", "issuingAuthority": "مرجع صادر کننده", @@ -5819,11 +6551,19 @@ "numberOfVolumes": "تعداد جلد", "numPages": "تعداد صفحه", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "صفحات", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "شماره ثبت اختراع", "place": "مکان", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "نوع پست", "presentationType": "نوع", + "priorityDate": "Priority Date", "priorityNumbers": "شماره‌های اولویت", "proceedingsTitle": "عنوان مجموعه مقالات", "programmingLanguage": "Prog. Language", @@ -5847,6 +6587,7 @@ "seriesText": "متن مجموعه", "seriesTitle": "عنوان مجموعه", "session": "جلسه", + "sessionTitle": "Session Title", "shortTitle": "عنوان کوتاه", "status": "Status", "studio": "استودیو", @@ -5870,17 +6611,24 @@ "bookAuthor": "نویسنده کتاب", "cartographer": "نقشه‌کش", "castMember": "عضو گروه", + "chair": "Chair", "commenter": "مفسر", "composer": "آهنگساز", "contributor": "پدیدآور", "cosponsor": "پشتیبان دوم", "counsel": "مشاور", + "creator": "پدیدآورنده", "director": "کارگردان", "editor": "ویرایشگر", + "executiveProducer": "Executive Producer", "guest": "مهمان", + "host": "Host", "interviewee": "مصاحبه با", "interviewer": "مصاحبه‌گر", "inventor": "مخترع", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "مجری", "podcaster": "Podcaster", "presenter": "ارائه‌دهنده", @@ -5889,6 +6637,7 @@ "recipient": "گیرنده", "reviewedAuthor": "Reviewed Author", "scriptwriter": "نمایشنامه‌نویس", + "seriesCreator": "Series Creator", "seriesEditor": "ویرایشگر مجموعه", "sponsor": "پشتیبان", "translator": "مترجم", @@ -5979,6 +6728,7 @@ "edition": "Painos", "encyclopediaTitle": "Tietosanakirjan otsake", "episodeNumber": "Jakson numero", + "eventPlace": "Event Place", "extra": "Ylim.", "filingDate": "Arkistointipäivä", "firstPage": "Ensimmäinen sivu", @@ -6012,11 +6762,19 @@ "numberOfVolumes": "Niteiden lkm.", "numPages": "Sivumäärä", "organization": "Organisaatio", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Sivut", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patenttinumero", "place": "Paikka", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tyyppi", "presentationType": "Tyyppi", + "priorityDate": "Priority Date", "priorityNumbers": "Etuoikeusnumerot", "proceedingsTitle": "Konferenssijulkaisun otsikko", "programmingLanguage": "Ohjelmointikieli", @@ -6040,6 +6798,7 @@ "seriesText": "Sarjan teksti", "seriesTitle": "Sarjan nimi", "session": "Istunto", + "sessionTitle": "Session Title", "shortTitle": "Lyhyt nimi", "status": "Tila", "studio": "Studio", @@ -6063,17 +6822,24 @@ "bookAuthor": "Kirjan tekijä", "cartographer": "Kartoittaja", "castMember": "Näyttelijä", + "chair": "Chair", "commenter": "Kommentoija", "composer": "Säveltäjä", "contributor": "Muu tekijä", "cosponsor": "Osasponsori", "counsel": "Oikeusavustaja", + "creator": "Tekijä", "director": "Ohjaaja", "editor": "Toimittaja", + "executiveProducer": "Executive Producer", "guest": "Vieras", + "host": "Host", "interviewee": "Haastattelussa", "interviewer": "Haastattelija", "inventor": "Keksijä", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Esiintyjä", "podcaster": "Podcastin tekijä", "presenter": "Esittäjä", @@ -6082,6 +6848,7 @@ "recipient": "Vastaanottaja", "reviewedAuthor": "Arvostelun kohde", "scriptwriter": "Käsikirjoittaja", + "seriesCreator": "Series Creator", "seriesEditor": "Sarjan toimittaja", "sponsor": "Sponsori", "translator": "Kääntäjä", @@ -6172,6 +6939,7 @@ "edition": "Édition", "encyclopediaTitle": "Titre de l'encycl.", "episodeNumber": "N° de l'épisode", + "eventPlace": "Lieu de l'événement", "extra": "Extra", "filingDate": "Date de dépôt", "firstPage": "Première page", @@ -6205,11 +6973,19 @@ "numberOfVolumes": "Nb de volumes", "numPages": "Nb de pages", "organization": "Organisation", + "originalDate": "Date originale", + "originalPlace": "Lieu original", + "originalPublisher": "Éditeur original", "pages": "Pages", + "partNumber": "N° de partie", + "partTitle": "Titre de partie", "patentNumber": "N° de brevet", "place": "Lieu", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Type d'article", "presentationType": "Type", + "priorityDate": "Date de priorité", "priorityNumbers": "Numéros de priorité", "proceedingsTitle": "Titre des actes", "programmingLanguage": "Langage de programmation", @@ -6233,6 +7009,7 @@ "seriesText": "Texte de la coll.", "seriesTitle": "Titre de la coll.", "session": "Session", + "sessionTitle": "Titre de session", "shortTitle": "Titre abrégé", "status": "Statut", "studio": "Studio", @@ -6256,17 +7033,24 @@ "bookAuthor": "Auteur du livre", "cartographer": "Cartographe", "castMember": "Membre de la distribution", + "chair": "Chair", "commenter": "Commentateur", "composer": "Compositeur", "contributor": "Collaborateur", "cosponsor": "Co-parrain", "counsel": "Conseiller", + "creator": "Créateur", "director": "Metteur en scène", "editor": "Éditeur", + "executiveProducer": "Producteur exécutif", "guest": "Invité", + "host": "Hôte", "interviewee": "Interviewé", "interviewer": "Reporter", "inventor": "Inventeur", + "narrator": "Narrateur", + "organizer": "Organisateur", + "originalCreator": "Créateur original", "performer": "Interprète", "podcaster": "Diffuseur", "presenter": "Présentateur", @@ -6275,6 +7059,7 @@ "recipient": "Destinataire", "reviewedAuthor": "Auteur recensé", "scriptwriter": "Scénariste", + "seriesCreator": "Créateur de coll.", "seriesEditor": "Directeur de coll.", "sponsor": "Auteur", "translator": "Traducteur", @@ -6365,6 +7150,7 @@ "edition": "Edición", "encyclopediaTitle": "Título da enciclopedia", "episodeNumber": "Número de episodio", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Data de entrada en arquivo", "firstPage": "Primeira páxina", @@ -6398,11 +7184,19 @@ "numberOfVolumes": "Nº de tomos", "numPages": "Nº de Páxinas", "organization": "Organización", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Páxinas", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Número da patente", "place": "Lugar", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tipo de entrada", "presentationType": "Tipo", + "priorityDate": "Priority Date", "priorityNumbers": "Números de prioridade", "proceedingsTitle": "Título das medidas legais", "programmingLanguage": "Ling. de programación", @@ -6426,6 +7220,7 @@ "seriesText": "Texto da serie", "seriesTitle": "Título da serie", "session": "Sesión", + "sessionTitle": "Session Title", "shortTitle": "Título curto", "status": "Estado", "studio": "Estudio", @@ -6449,17 +7244,24 @@ "bookAuthor": "Autor do libro", "cartographer": "Cartógrafo", "castMember": "Membro do elenco", + "chair": "Chair", "commenter": "Comentarista", "composer": "Compositor", "contributor": "Colaborador", "cosponsor": "Copatrocinador", "counsel": "Avogado", + "creator": "Creador", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Invitado", + "host": "Host", "interviewee": "Entrevista con", "interviewer": "Entrevista", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Intérprete", "podcaster": "Fonte do podcast", "presenter": "Presentador", @@ -6468,6 +7270,7 @@ "recipient": "Receptor", "reviewedAuthor": "Autor reseñado", "scriptwriter": "Guionista", + "seriesCreator": "Series Creator", "seriesEditor": "Editor da serie", "sponsor": "Patrocinador", "translator": "Tradutor", @@ -6558,6 +7361,7 @@ "edition": "מהדורה", "encyclopediaTitle": "שם אנציקלופדיה", "episodeNumber": "מספר פרק", + "eventPlace": "Event Place", "extra": "תוספת", "filingDate": "תאריך תיוק", "firstPage": "עמוד ראשון", @@ -6568,7 +7372,7 @@ "identifier": "Identifier", "institution": "מוסד", "interviewMedium": "אמצעי", - "ISBN": "מסת״ב", + "ISBN": "ISBN", "ISSN": "ISSN", "issue": "גיליון", "issueDate": "תאריך הנפקה", @@ -6591,11 +7395,19 @@ "numberOfVolumes": "מס׳ כרכים", "numPages": "מס׳ עמודים", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "עמודים", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "מספר פטנט", "place": "מקום", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "סוג", + "priorityDate": "Priority Date", "priorityNumbers": "מספרי עדיפות", "proceedingsTitle": "כותרת תביעה", "programmingLanguage": "שפת פיתוח", @@ -6619,6 +7431,7 @@ "seriesText": "טקסט סדרה", "seriesTitle": "שם סדרה", "session": "מפגש", + "sessionTitle": "Session Title", "shortTitle": "כותרת קצרה", "status": "Status", "studio": "סטודיו", @@ -6642,17 +7455,24 @@ "bookAuthor": "כותב/ת הספר", "cartographer": "קרטוגרף", "castMember": "חבר בצוות המשתתפים", + "chair": "Chair", "commenter": "מגיב/ה", "composer": "מלחין", "contributor": "Contributor", "cosponsor": "תומך/ת", "counsel": "פרקליט", + "creator": "יוצר", "director": "במאי", "editor": "עורך", + "executiveProducer": "Executive Producer", "guest": "אורח", + "host": "Host", "interviewee": "ראיון עם", "interviewer": "מראיין", "inventor": "ממציא", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "מבצע", "podcaster": "שדרן או שדרנית הסכתים", "presenter": "מציג", @@ -6661,6 +7481,7 @@ "recipient": "נמען", "reviewedAuthor": "יוצר/ת סוקר/ת", "scriptwriter": "תסריטאי", + "seriesCreator": "Series Creator", "seriesEditor": "עורך סדרה", "sponsor": "נותן חסות", "translator": "מתרגם", @@ -6751,6 +7572,7 @@ "edition": "Edition", "encyclopediaTitle": "Encyclopedia Title", "episodeNumber": "Episode Number", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Filing Date", "firstPage": "First Page", @@ -6784,11 +7606,19 @@ "numberOfVolumes": "# of Volumes", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pages", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Number", "place": "Place", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Priority Numbers", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Prog. Language", @@ -6812,6 +7642,7 @@ "seriesText": "Series Text", "seriesTitle": "Series Title", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Studio", @@ -6835,17 +7666,24 @@ "bookAuthor": "Book Author", "cartographer": "Cartographer", "castMember": "Cast Member", + "chair": "Chair", "commenter": "Commenter", "composer": "Composer", "contributor": "Contributor", "cosponsor": "Cosponsor", "counsel": "Counsel", + "creator": "Creator", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Interview With", "interviewer": "Interviewer", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -6854,6 +7692,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Translator", @@ -6944,6 +7783,7 @@ "edition": "Kiadás", "encyclopediaTitle": "Lexikon címe", "episodeNumber": "Epizód száma", + "eventPlace": "Event Place", "extra": "Egyéb", "filingDate": "Iktatás időpontja", "firstPage": "Első oldal", @@ -6977,11 +7817,19 @@ "numberOfVolumes": "Kötetek száma", "numPages": "Terjedelem", "organization": "Szervezet", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Oldalszám", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Szabadalom száma", "place": "Hely", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Bejegyzés típusa", "presentationType": "Típus", + "priorityDate": "Priority Date", "priorityNumbers": "Elsőbbségi sorrend", "proceedingsTitle": "Kiadvány címe", "programmingLanguage": "Prog. nyelv", @@ -7005,6 +7853,7 @@ "seriesText": "Sorozat szövege", "seriesTitle": "Sorozat címe", "session": "Ülésszak", + "sessionTitle": "Session Title", "shortTitle": "Rövid cím", "status": "Status", "studio": "Stúdió", @@ -7028,17 +7877,24 @@ "bookAuthor": "Könyv szerzője", "cartographer": "Térképész", "castMember": "Szereplő", + "chair": "Chair", "commenter": "Hozzászóló", "composer": "Zeneszerző", "contributor": "Közreműködő", "cosponsor": "Cosponsor", "counsel": "Ügyvéd", + "creator": "Szerző", "director": "Rendező", "editor": "Szerkesztő", + "executiveProducer": "Executive Producer", "guest": "Vendég", + "host": "Host", "interviewee": "Interjú alanya", "interviewer": "Interjú készítője", "inventor": "Feltaláló", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Előadó", "podcaster": "Podcaster", "presenter": "Előadó", @@ -7047,6 +7903,7 @@ "recipient": "Alperes", "reviewedAuthor": "Recenzált mű szerzője", "scriptwriter": "Forgatókönyvíró", + "seriesCreator": "Series Creator", "seriesEditor": "Sorozatszerkesztő", "sponsor": "Benyújtó", "translator": "Fordító", @@ -7137,6 +7994,7 @@ "edition": "Edisi", "encyclopediaTitle": "Judul Ensiklopedia", "episodeNumber": "Nomor Episode", + "eventPlace": "Event Place", "extra": "Ekstra", "filingDate": "Tanggal Pembuatan", "firstPage": "Halaman Pertama", @@ -7170,11 +8028,19 @@ "numberOfVolumes": "# Volume", "numPages": "# halaman", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Halaman", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Nomor Paten", "place": "Tempat", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Jenis Pos", "presentationType": "Jenis", + "priorityDate": "Priority Date", "priorityNumbers": "Nomor Prioritas", "proceedingsTitle": "Judul Rapat", "programmingLanguage": "Bahasa Pemrograman", @@ -7198,6 +8064,7 @@ "seriesText": "Teks Seri", "seriesTitle": "Judul Seri", "session": "Sesi", + "sessionTitle": "Session Title", "shortTitle": "Judul Singkat", "status": "Status", "studio": "Studio", @@ -7221,17 +8088,24 @@ "bookAuthor": "Penulis Buku", "cartographer": "Pembuat Peta", "castMember": "Pemain", + "chair": "Chair", "commenter": "Pemberi Komentar", "composer": "Komposer", "contributor": "Kontributor", "cosponsor": "Kosponsor", "counsel": "Advokat", + "creator": "Penyusun", "director": "Direktur", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Bintang Tamu", + "host": "Host", "interviewee": "Wawancara dengan", "interviewer": "Pewawancara", "inventor": "Penemu", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -7240,6 +8114,7 @@ "recipient": "Penerima", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Penulis Skrip", + "seriesCreator": "Series Creator", "seriesEditor": "Editor Seri", "sponsor": "Sponsor", "translator": "Penerjemah", @@ -7330,6 +8205,7 @@ "edition": "Útgáfa", "encyclopediaTitle": "Nafn alfræðirits", "episodeNumber": "Þáttur númer", + "eventPlace": "Event Place", "extra": "Viðbót", "filingDate": "Dagsetning skráningar", "firstPage": "Fyrsta síða", @@ -7363,11 +8239,19 @@ "numberOfVolumes": "Fjöldi binda", "numPages": "# síður", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Blaðsíður", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Einkaleyfi nr.", "place": "Staðsetning", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Póstsnið", "presentationType": "Tegund", + "priorityDate": "Priority Date", "priorityNumbers": "Forgangsnúmer", "proceedingsTitle": "Titill málstofu", "programmingLanguage": "Prog. Language", @@ -7391,6 +8275,7 @@ "seriesText": "Nafn eintaks í ritröð", "seriesTitle": "Titill ritraðar", "session": "Seta", + "sessionTitle": "Session Title", "shortTitle": "Stuttur titill", "status": "Status", "studio": "Stúdíó", @@ -7414,17 +8299,24 @@ "bookAuthor": "Höfundur bókar", "cartographer": "Kortagerð", "castMember": "Leikari", + "chair": "Chair", "commenter": "Athugasemdir", "composer": "Höfundur", "contributor": "Aðili að verki", "cosponsor": "Stuðningsþátttakandi", "counsel": "Ráðgjöf", + "creator": "Höfundur", "director": "Leikstjóri", "editor": "Ritstjóri", + "executiveProducer": "Executive Producer", "guest": "Gestur", + "host": "Host", "interviewee": "Viðtal við", "interviewer": "Hver tók viðtalið", "inventor": "Uppfinningamaður", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Leikari", "podcaster": "Hlaðvörpun", "presenter": "Kynnandi", @@ -7433,6 +8325,7 @@ "recipient": "Viðtakandi", "reviewedAuthor": "Yfirlestrarhöfundur", "scriptwriter": "Handritshöfundur", + "seriesCreator": "Series Creator", "seriesEditor": "Ritstjóri ritraðar", "sponsor": "Stuðningsaðili", "translator": "Þýðandi", @@ -7523,6 +8416,7 @@ "edition": "Edizione", "encyclopediaTitle": "Titolo enciclopedia", "episodeNumber": "Numero di episodio", + "eventPlace": "Luogo dell'evento", "extra": "Extra", "filingDate": "Data di sottomissione", "firstPage": "Prima pagina", @@ -7556,11 +8450,19 @@ "numberOfVolumes": "Numero di volumi", "numPages": "# di Pagine", "organization": "Organizzazione", + "originalDate": "Data originale", + "originalPlace": "Luogo originale", + "originalPublisher": "Editore originale", "pages": "Pagine", + "partNumber": "Numero della parte", + "partTitle": "Titolo della parte", "patentNumber": "Numero di brevetto", "place": "Luogo di edizione", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tipo di messaggio", "presentationType": "Tipo", + "priorityDate": "Data prioritaria", "priorityNumbers": "Numero di priorità", "proceedingsTitle": "Titolo degli atti", "programmingLanguage": "Linguaggio di progr.", @@ -7584,6 +8486,7 @@ "seriesText": "Testo della serie", "seriesTitle": "Titolo della serie", "session": "Sessione", + "sessionTitle": "Titolo della sessione", "shortTitle": "Titolo breve", "status": "Stato della pubblicazione", "studio": "Studio", @@ -7607,17 +8510,24 @@ "bookAuthor": "Autore del libro", "cartographer": "Cartografo", "castMember": "Componente del cast", + "chair": "Presidente", "commenter": "Commentatore", "composer": "Compositore", "contributor": "Collaboratore", "cosponsor": "Co-finanziatore", "counsel": "Consulente legale", + "creator": "Autore", "director": "Regista", "editor": "Curatore", + "executiveProducer": "Produttore esecutivo", "guest": "Ospite", + "host": "Conduttore", "interviewee": "Intervista con", "interviewer": "Intervistatore", "inventor": "Inventore", + "narrator": "Narratore", + "organizer": "Organizzatore", + "originalCreator": "Autore originale", "performer": "Esecutore", "podcaster": "Autore del podcast", "presenter": "Presentatore", @@ -7626,6 +8536,7 @@ "recipient": "Destinatario", "reviewedAuthor": "Autore recensito", "scriptwriter": "Sceneggiatore", + "seriesCreator": "Autore della serie", "seriesEditor": "Curatore della serie", "sponsor": "Finanziatore", "translator": "Traduttore", @@ -7716,6 +8627,7 @@ "edition": "版", "encyclopediaTitle": "百科事典名", "episodeNumber": "エピソードの番号", + "eventPlace": "Event Place", "extra": "その他", "filingDate": "出願日", "firstPage": "最初のページ", @@ -7749,11 +8661,19 @@ "numberOfVolumes": "巻数", "numPages": "#ページ", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "ページ数", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "特許番号", "place": "都市", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "書き込みの種類", "presentationType": "種類", + "priorityDate": "Priority Date", "priorityNumbers": "優先番号", "proceedingsTitle": "紀要名", "programmingLanguage": "プログラミング言語", @@ -7777,6 +8697,7 @@ "seriesText": "叢書テキスト", "seriesTitle": "叢書名", "session": "セッション", + "sessionTitle": "Session Title", "shortTitle": "題名 (略)", "status": "ステータス", "studio": "スタジオ", @@ -7800,17 +8721,24 @@ "bookAuthor": "書籍著者名", "cartographer": "製図家", "castMember": "キャスト", + "chair": "Chair", "commenter": "評論家", "composer": "作曲家", "contributor": "寄稿者名", "cosponsor": "共同スポンサー", "counsel": "顧問弁護士", + "creator": "編著者名", "director": "監督", "editor": "編集者名", + "executiveProducer": "Executive Producer", "guest": "ゲスト", + "host": "Host", "interviewee": "インタビュー対象:", "interviewer": "インタビュアー", "inventor": "発明者名", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "演奏者", "podcaster": "ポッドキャスト送信者", "presenter": "発表者", @@ -7819,6 +8747,7 @@ "recipient": "受取人", "reviewedAuthor": "レビューされた著者", "scriptwriter": "脚本家", + "seriesCreator": "Series Creator", "seriesEditor": "叢書編集者名", "sponsor": "スポンサー", "translator": "翻訳者名", @@ -7905,10 +8834,11 @@ "distributor": "ចែកចាយ", "docketNumber": "លេខសំណុំរឿង", "documentNumber": "លេខឯកសារ", - "DOI": "ឌីអូអាយ", + "DOI": "DOI", "edition": "កំណែតម្រូវ", "encyclopediaTitle": "ចំណងជើងសព្វវចនាធិប្បាយ", "episodeNumber": "លេខអង្គហេតុ", + "eventPlace": "Event Place", "extra": "បន្ថែម", "filingDate": "កាលបរិច្ឆេទតម្កល់", "firstPage": "ទំព័រទីមួយ", @@ -7919,8 +8849,8 @@ "identifier": "Identifier", "institution": "ស្ថាប័ន", "interviewMedium": "សារព័ត៌មាន", - "ISBN": "អាយអេសប៊ីអិន", - "ISSN": "អាយអេសអេសអិន", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "ចេញផ្សាយ", "issueDate": "កាលបរិច្ឆទចេញផ្សាយ", "issuingAuthority": "អាជ្ញាធរចេញផ្សាយ", @@ -7942,11 +8872,19 @@ "numberOfVolumes": "លេខវ៉ុល", "numPages": "លេខទំព័រ", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "ទំព័រ", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "លេខតត្តកម្ម", "place": "ទីតាំង", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "ប្រភេទផ្សាយ", "presentationType": "ប្រភេទ", + "priorityDate": "Priority Date", "priorityNumbers": "លេខអាទិភាព", "proceedingsTitle": "ចំណងជើងនីតិវិធី", "programmingLanguage": "Prog. Language", @@ -7970,6 +8908,7 @@ "seriesText": "អត្ថបទលេខរៀង", "seriesTitle": "ចំណងជើងលេខរៀង", "session": "សម័យកាល", + "sessionTitle": "Session Title", "shortTitle": "ចំណងជើងខ្លី", "status": "Status", "studio": "ស្ថានីយថតសំឡេង", @@ -7993,17 +8932,24 @@ "bookAuthor": "អ្នកនិពន្ធសៀវភៅ", "cartographer": "អ្នករៀបចំប្លង់", "castMember": "តួសំដែង", + "chair": "Chair", "commenter": "អ្នកផ្តល់មតិយោបល់", "composer": "អ្នកនិពន្ធទំនុក", "contributor": "អ្នកចូលរួម", "cosponsor": "សហអ្នកឧបត្ថម្ភ", "counsel": "ក្រុមប្រឹក្សា", + "creator": "អ្នកនិពន្ធ", "director": "នាយក", "editor": "អ្នកកែតម្រូវ", + "executiveProducer": "Executive Producer", "guest": "ភ្ញៀវ", + "host": "Host", "interviewee": "សម្ភាសន៍ជាមួយ", "interviewer": "អ្នកសម្ភាសន៍", "inventor": "អ្នកបង្កើត", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "អ្នកសំដែង", "podcaster": "អ្នកថតសំឡេងផដខាស្ត៍", "presenter": "អ្នកអត្ថាធិប្បាយ", @@ -8012,6 +8958,7 @@ "recipient": "អ្នកទទួល", "reviewedAuthor": "អ្នកនិពន្ធត្រួតពិនិត្យ", "scriptwriter": "អ្នកសរសេរអត្ថបទ", + "seriesCreator": "Series Creator", "seriesEditor": "អ្នកកែតម្រូវតាមលេខរៀង", "sponsor": "អ្នកឧបត្ថម្ភ", "translator": "អ្នកបកប្រែ", @@ -8102,6 +9049,7 @@ "edition": "판본", "encyclopediaTitle": "백과사전 명", "episodeNumber": "에피소드 번호", + "eventPlace": "Event Place", "extra": "추가사항", "filingDate": "Filing Date", "firstPage": "첫 페이지", @@ -8135,11 +9083,19 @@ "numberOfVolumes": "권수", "numPages": "총 페이지수", "organization": "조직", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "쪽", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "특허 번호", "place": "발행지", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "게시물 종류", "presentationType": "형식", + "priorityDate": "Priority Date", "priorityNumbers": "우선 번호", "proceedingsTitle": "의사록", "programmingLanguage": "프로그래밍 언어", @@ -8163,6 +9119,7 @@ "seriesText": "시리즈 텍스트", "seriesTitle": "시리즈 제목", "session": "세션", + "sessionTitle": "Session Title", "shortTitle": "짧은 제목", "status": "상태", "studio": "스튜디오", @@ -8186,17 +9143,24 @@ "bookAuthor": "책 저자", "cartographer": "지도 제작자", "castMember": "출연자", + "chair": "Chair", "commenter": "비평가", "composer": "작곡가", "contributor": "공헌자", "cosponsor": "Cosponsor", "counsel": "회의", + "creator": "창작가", "director": "감독", "editor": "편집자", + "executiveProducer": "Executive Producer", "guest": "손님", + "host": "Host", "interviewee": "인터뷰:", "interviewer": "인터뷰진행자", "inventor": "발명자", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "연주자", "podcaster": "팟캐스터", "presenter": "제출자", @@ -8205,6 +9169,7 @@ "recipient": "수령인", "reviewedAuthor": "평론가", "scriptwriter": "각본가", + "seriesCreator": "Series Creator", "seriesEditor": "시리즈 편집자", "sponsor": "후원자", "translator": "번역자", @@ -8295,6 +9260,7 @@ "edition": "Leidimo nr.", "encyclopediaTitle": "Enciklopedijos pavadinimas", "episodeNumber": "Epizodo numeris", + "eventPlace": "Event Place", "extra": "Papildoma", "filingDate": "Užpildymo data", "firstPage": "Pirmas puslapis", @@ -8328,11 +9294,19 @@ "numberOfVolumes": "Tomų skaičius", "numPages": "Puslapių kiekis", "organization": "Organizacija", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Puslapiai", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patento numeris", "place": "Vieta", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Pranešimo tipas", "presentationType": "Tipas", + "priorityDate": "Priority Date", "priorityNumbers": "Prioriteto numeris", "proceedingsTitle": "Konf. leidinio pavadinimas", "programmingLanguage": "Prog. kalba", @@ -8356,6 +9330,7 @@ "seriesText": "Serijos tekstas", "seriesTitle": "Serijos pavadinimas", "session": "Sesija", + "sessionTitle": "Session Title", "shortTitle": "Trumpas pavad.", "status": "Būsena", "studio": "Dirbtuvė/studija", @@ -8379,17 +9354,24 @@ "bookAuthor": "Knygos autorius", "cartographer": "Kartografas", "castMember": "Atlikėjas/artistas", + "chair": "Chair", "commenter": "Komentuotojas", "composer": "Kūrėjas/kompozitorius", "contributor": "Bendradarbis", "cosponsor": "Kitas rėmėjas", "counsel": "Advokatas", + "creator": "Autorius", "director": "Vadovas", "editor": "Redaktorius", + "executiveProducer": "Executive Producer", "guest": "Svečias", + "host": "Host", "interviewee": "Pokalbis su", "interviewer": "Apklausėjas", "inventor": "išradėjas", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Atlikėjas", "podcaster": "Transliuotojas", "presenter": "Vedėjas", @@ -8398,6 +9380,7 @@ "recipient": "Gavėjas", "reviewedAuthor": "Peržiūrėtas autorius", "scriptwriter": "Scenaristas", + "seriesCreator": "Series Creator", "seriesEditor": "Serijos sudarytojas", "sponsor": "Rėmėjas", "translator": "Vertėjas", @@ -8488,6 +9471,7 @@ "edition": "Edition", "encyclopediaTitle": "Encyclopedia Title", "episodeNumber": "Episode Number", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Filing Date", "firstPage": "First Page", @@ -8521,11 +9505,19 @@ "numberOfVolumes": "# of Volumes", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pages", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Number", "place": "Place", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Type", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Priority Numbers", "proceedingsTitle": "Proceedings Title", "programmingLanguage": "Prog. Language", @@ -8549,6 +9541,7 @@ "seriesText": "Series Text", "seriesTitle": "Series Title", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Short Title", "status": "Status", "studio": "Studio", @@ -8572,17 +9565,24 @@ "bookAuthor": "Book Author", "cartographer": "Cartographer", "castMember": "Cast Member", + "chair": "Chair", "commenter": "Commenter", "composer": "Composer", "contributor": "Contributor", "cosponsor": "Cosponsor", "counsel": "Counsel", + "creator": "Creator", "director": "Director", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Guest", + "host": "Host", "interviewee": "Interview With", "interviewer": "Interviewer", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Podcaster", "presenter": "Presenter", @@ -8591,6 +9591,7 @@ "recipient": "Recipient", "reviewedAuthor": "Reviewed Author", "scriptwriter": "Scriptwriter", + "seriesCreator": "Series Creator", "seriesEditor": "Series Editor", "sponsor": "Sponsor", "translator": "Translator", @@ -8599,7 +9600,7 @@ }, "nb-NO": { "itemTypes": { - "annotation": "Markering", + "annotation": "Kommentar", "artwork": "Kunstverk", "attachment": "Vedlegg", "audioRecording": "Lydopptak", @@ -8681,6 +9682,7 @@ "edition": "Utgave", "encyclopediaTitle": "Oppslagverk", "episodeNumber": "Episodenummer", + "eventPlace": "Sted for begivenhet", "extra": "Ekstra", "filingDate": "Innleveringsdato", "firstPage": "Første side", @@ -8714,11 +9716,19 @@ "numberOfVolumes": "# av volumer", "numPages": "# av sider", "organization": "Organisasjon", + "originalDate": "Opprinnelig dato", + "originalPlace": "Opprinnelig sted", + "originalPublisher": "Opprinnelig utgiver", "pages": "Sider", + "partNumber": "Delnummer", + "partTitle": "Deltittel", "patentNumber": "Patentnummer", "place": "Sted", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Posttype", "presentationType": "Type", + "priorityDate": "Prioriteringsdato", "priorityNumbers": "Prioritetsnummer", "proceedingsTitle": "Sakstittel", "programmingLanguage": "Programmeringsspråk", @@ -8742,6 +9752,7 @@ "seriesText": "Serietekst", "seriesTitle": "Serietittel", "session": "Sesjon", + "sessionTitle": "Tittel for sesjon", "shortTitle": "Kort tittel", "status": "Status", "studio": "Studio", @@ -8765,17 +9776,24 @@ "bookAuthor": "Bokforfatter", "cartographer": "Kartograf", "castMember": "Skuespiller", + "chair": "Leder", "commenter": "Kommentator", "composer": "Komponist", "contributor": "Medforfatter", "cosponsor": "Medsponsor", "counsel": "Rådgiver", + "creator": "Opphaver", "director": "Instruktør", "editor": "Redaktør", + "executiveProducer": "Utøvende produsent", "guest": "Gjest", + "host": "Vert", "interviewee": "Intervju med", "interviewer": "Intervjuer", "inventor": "Oppfinner", + "narrator": "Forteller", + "organizer": "Organisator", + "originalCreator": "Opprinnelig skaper", "performer": "Utøver", "podcaster": "Podcaster", "presenter": "Presentatør", @@ -8784,6 +9802,7 @@ "recipient": "Mottaker", "reviewedAuthor": "Anmeldt forfatter", "scriptwriter": "Manusforfatter", + "seriesCreator": "Serieskaper", "seriesEditor": "Serieredaktør", "sponsor": "Sponsor", "translator": "Oversetter", @@ -8874,6 +9893,7 @@ "edition": "Druk", "encyclopediaTitle": "Encyclopedie-titel", "episodeNumber": "Afleveringsnummer", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Indieningsdatum", "firstPage": "Eerste pagina", @@ -8907,11 +9927,19 @@ "numberOfVolumes": "# delen", "numPages": "Aantal pagina's", "organization": "Organisatie", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pagina's", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patentnummer", "place": "Plaats", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Type post", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Prioriteitsnummers", "proceedingsTitle": "Titel notulen", "programmingLanguage": "Prog. taal", @@ -8935,6 +9963,7 @@ "seriesText": "Reeks (extra tekst)", "seriesTitle": "Titel van de reeks", "session": "Sessie", + "sessionTitle": "Session Title", "shortTitle": "Korte Titel", "status": "Status", "studio": "Studio", @@ -8958,17 +9987,24 @@ "bookAuthor": "Auteur van het boek", "cartographer": "Cartograaf", "castMember": "Cast-member", + "chair": "Chair", "commenter": "Commentator", "composer": "Componist", "contributor": "Coauteur", "cosponsor": "Cosponsor", "counsel": "Raad", + "creator": "Maker", "director": "Regisseur", "editor": "Redacteur", + "executiveProducer": "Executive Producer", "guest": "Gast", + "host": "Host", "interviewee": "Interview met", "interviewer": "Interviewer", "inventor": "Uitvinder", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Uitvoerder", "podcaster": "Podcaster", "presenter": "Presentator", @@ -8977,6 +10013,7 @@ "recipient": "Ontvanger", "reviewedAuthor": "Besproken auteur", "scriptwriter": "Tekstschrijver", + "seriesCreator": "Series Creator", "seriesEditor": "Redacteur van de reeks", "sponsor": "Sponsor", "translator": "Vertaler", @@ -9067,6 +10104,7 @@ "edition": "Utgåve", "encyclopediaTitle": "Oppslagverk", "episodeNumber": "Episodenummer", + "eventPlace": "Event Place", "extra": "Ekstra", "filingDate": "Arkiveringsdato", "firstPage": "Første side", @@ -9100,11 +10138,19 @@ "numberOfVolumes": "# av volum", "numPages": "Tal sider", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Sidetal", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patentnummer", "place": "Stad", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Posttype", "presentationType": "Type", + "priorityDate": "Priority Date", "priorityNumbers": "Prioritetnummer", "proceedingsTitle": "Sakstittel", "programmingLanguage": "Prog. Language", @@ -9128,6 +10174,7 @@ "seriesText": "Serietekst", "seriesTitle": "Serietittel", "session": "Sesjon", + "sessionTitle": "Session Title", "shortTitle": "Kort tittel", "status": "Status", "studio": "Studio", @@ -9151,17 +10198,24 @@ "bookAuthor": "Bokforfattar", "cartographer": "Kartograf", "castMember": "Skodespelar", + "chair": "Chair", "commenter": "Kommentator", "composer": "Komponist", "contributor": "Medforfatter", "cosponsor": "Medsponsor", "counsel": "Rådgjevar", + "creator": "Namn", "director": "Instruktør", "editor": "Redaktør", + "executiveProducer": "Executive Producer", "guest": "Gjest", + "host": "Host", "interviewee": "Intervju med", "interviewer": "Intervjuar", "inventor": "Oppfinnar", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Utøvar", "podcaster": "Podkastar", "presenter": "Presentatør", @@ -9170,6 +10224,7 @@ "recipient": "Mottakar", "reviewedAuthor": "Meld forfattar", "scriptwriter": "Manusforfattar", + "seriesCreator": "Series Creator", "seriesEditor": "Serieredaktør", "sponsor": "Sponsor", "translator": "Omsetjar", @@ -9260,6 +10315,7 @@ "edition": "Wydanie", "encyclopediaTitle": "Tytuł encyklopedii", "episodeNumber": "Numer odcinka", + "eventPlace": "Miejsce zdarzenia", "extra": "Dodatkowe", "filingDate": "Data wypełnienia", "firstPage": "Pierwsza strona", @@ -9293,11 +10349,19 @@ "numberOfVolumes": "Liczba tomów", "numPages": "Liczba stron", "organization": "Organizacja", + "originalDate": "Oryginalna data", + "originalPlace": "Oryginalne miejsce", + "originalPublisher": "Oryginalny wydawca", "pages": "Strony", + "partNumber": "Numer części", + "partTitle": "Tytuł części", "patentNumber": "Numer patentu", "place": "Miejsce", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Typ wpisu", "presentationType": "Typ", + "priorityDate": "Priority Date", "priorityNumbers": "Numery priorytetu", "proceedingsTitle": "Tytuł sprawozdania", "programmingLanguage": "Jęz. programowania", @@ -9321,6 +10385,7 @@ "seriesText": "Tekst serii", "seriesTitle": "Tytuł serii", "session": "Sesja", + "sessionTitle": "Tytuł sesji", "shortTitle": "Krótki tytuł", "status": "Stan", "studio": "Studio", @@ -9344,17 +10409,24 @@ "bookAuthor": "Autor książki", "cartographer": "Kartograf", "castMember": "Aktor", + "chair": "Chair", "commenter": "Komentator", "composer": "Kompozytor", "contributor": "Współautor", "cosponsor": "Współsponsor", "counsel": "Prawnik", + "creator": "Twórca", "director": "Reżyser", "editor": "Redaktor", + "executiveProducer": "Executive Producer", "guest": "Gość", + "host": "Host", "interviewee": "Wywiad z", "interviewer": "Prowadzący wywiad", "inventor": "Wynalazca", + "narrator": "Narrator", + "organizer": "Organizator", + "originalCreator": "Oryginalny twórca", "performer": "Odtwórca", "podcaster": "Autor podcastu", "presenter": "Prezenter", @@ -9363,6 +10435,7 @@ "recipient": "Odbiorca", "reviewedAuthor": "Autor recenzji", "scriptwriter": "Scenarzysta", + "seriesCreator": "Twórca serii", "seriesEditor": "Redaktor serii", "sponsor": "Fundator", "translator": "Tłumacz", @@ -9453,6 +10526,7 @@ "edition": "Número da edição", "encyclopediaTitle": "Título da enciclopédia", "episodeNumber": "Número do episódio", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Data de arquivamento", "firstPage": "Primeira página", @@ -9486,11 +10560,19 @@ "numberOfVolumes": "# de volumes", "numPages": "# de páginas", "organization": "Organização", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Páginas", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Número da Patente", "place": "Lugar", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tipo de envio", "presentationType": "Tipo", + "priorityDate": "Priority Date", "priorityNumbers": "Números prioritários", "proceedingsTitle": "Título dos anais", "programmingLanguage": "Linguagem de programação", @@ -9514,6 +10596,7 @@ "seriesText": "Texto da série", "seriesTitle": "Título da série", "session": "Sessão", + "sessionTitle": "Session Title", "shortTitle": "Título curto", "status": "Status", "studio": "Estúdio", @@ -9537,17 +10620,24 @@ "bookAuthor": "Autor do livro", "cartographer": "Cartógrafo", "castMember": "Membro do elenco", + "chair": "Chair", "commenter": "Comentarista", "composer": "Compositor", "contributor": "Contribuidor", "cosponsor": "Co-patrocinador", "counsel": "Conselho", + "creator": "Autor", "director": "Diretor", "editor": "Organizador", + "executiveProducer": "Executive Producer", "guest": "Convidado", + "host": "Host", "interviewee": "Entrevista com", "interviewer": "Entrevistador", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Ator", "podcaster": "Fonte do podcast", "presenter": "Apresentador", @@ -9556,6 +10646,7 @@ "recipient": "Destinatário", "reviewedAuthor": "Autor resenhado", "scriptwriter": "Roteirista", + "seriesCreator": "Series Creator", "seriesEditor": "Editor da série", "sponsor": "Propositor", "translator": "Tradutor", @@ -9646,6 +10737,7 @@ "edition": "Edição", "encyclopediaTitle": "Título da Enciclopédia", "episodeNumber": "Número do Episódio", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Data de Arquivo", "firstPage": "Primeira Página", @@ -9679,11 +10771,19 @@ "numberOfVolumes": "N.º de Volumes", "numPages": "N.º de Páginas", "organization": "Organização", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Páginas", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Número de Patente", "place": "Local", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Pós-Tipo", "presentationType": "Tipo", + "priorityDate": "Priority Date", "priorityNumbers": "Números de Prioridade", "proceedingsTitle": "Título das Actas", "programmingLanguage": "Linguagem de Programação", @@ -9707,6 +10807,7 @@ "seriesText": "Texto da Série", "seriesTitle": "Título da Série", "session": "Sessão", + "sessionTitle": "Session Title", "shortTitle": "Título Curto", "status": "Status", "studio": "Estúdio", @@ -9730,17 +10831,24 @@ "bookAuthor": "Autor do Livro", "cartographer": "Cartógrafo", "castMember": "Membro do Elenco", + "chair": "Chair", "commenter": "Comentador", "composer": "Compositor", "contributor": "Colaborador", "cosponsor": "Co-patrocinador", "counsel": "Conselho", + "creator": "Criador", "director": "Realizador", "editor": "Editor", + "executiveProducer": "Executive Producer", "guest": "Convidado", + "host": "Host", "interviewee": "Entrevista Com", "interviewer": "Entrevistador", "inventor": "Inventor", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Performer", "podcaster": "Locutor de Emissão Pod", "presenter": "Apresentador", @@ -9749,6 +10857,7 @@ "recipient": "Receptor", "reviewedAuthor": "Autor Revisto", "scriptwriter": "Guionista", + "seriesCreator": "Series Creator", "seriesEditor": "Editor da Série", "sponsor": "Patrocinador", "translator": "Tradutor", @@ -9839,6 +10948,7 @@ "edition": "Ediție", "encyclopediaTitle": "Titlu enciclopedie", "episodeNumber": "Număr episod", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Data completării", "firstPage": "Prima pagină", @@ -9872,11 +10982,19 @@ "numberOfVolumes": "Nr. de volume", "numPages": "Nr. de pagini", "organization": "Organizație", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Pagini", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Număr brevet", "place": "Loc", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Tip de comentariu", "presentationType": "Tip", + "priorityDate": "Priority Date", "priorityNumbers": "Numere de prioritate", "proceedingsTitle": "Titlu dare de seamă", "programmingLanguage": "Limbaj de programare", @@ -9900,6 +11018,7 @@ "seriesText": "Text colecție", "seriesTitle": "Titlu colecție", "session": "Sesiune", + "sessionTitle": "Session Title", "shortTitle": "Titlu scurt", "status": "Stare", "studio": "Studio", @@ -9923,17 +11042,24 @@ "bookAuthor": "Autor carte", "cartographer": "Cartograf", "castMember": "Membru în distribuție", + "chair": "Chair", "commenter": "Comentator", "composer": "Compozitor", "contributor": "Colaborator", "cosponsor": "Sponsor asociat", "counsel": "Consiliu", + "creator": "Creator", "director": "Director", "editor": "Editor (coord.)", + "executiveProducer": "Executive Producer", "guest": "Oaspete", + "host": "Host", "interviewee": "Interviu cu", "interviewer": "Interviu de", "inventor": "Inventator", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Interpret", "podcaster": "Autor multimedia", "presenter": "Prezentator", @@ -9942,6 +11068,7 @@ "recipient": "Recipient", "reviewedAuthor": "Autor recenzat", "scriptwriter": "Scriitor (de mână)", + "seriesCreator": "Series Creator", "seriesEditor": "Coordonator colecție", "sponsor": "Sponsor", "translator": "Traducător", @@ -10028,10 +11155,11 @@ "distributor": "Дистрибьютор", "docketNumber": "Номер выписки", "documentNumber": "Номер документа", - "DOI": "ЦИО/DOI", + "DOI": "DOI", "edition": "Издание", "encyclopediaTitle": "Назв. энцикл.", "episodeNumber": "Номер эпизода", + "eventPlace": "Event Place", "extra": "Дополнительно", "filingDate": "Дата заявки", "firstPage": "Первая стр.", @@ -10065,11 +11193,19 @@ "numberOfVolumes": "Кол-во томов", "numPages": "Число страниц", "organization": "Организация", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Страницы", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Номер патента", "place": "Место", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Тип сообщения", "presentationType": "Тип", + "priorityDate": "Priority Date", "priorityNumbers": "Номера приоритетов", "proceedingsTitle": "Назв. трудов", "programmingLanguage": "Прогр. яз.", @@ -10093,6 +11229,7 @@ "seriesText": "Текст серии", "seriesTitle": "Название серии", "session": "Сессия", + "sessionTitle": "Session Title", "shortTitle": "Краткое назв.", "status": "Статус", "studio": "Студия", @@ -10116,17 +11253,24 @@ "bookAuthor": "Автор книги", "cartographer": "Картограф", "castMember": "Актер", + "chair": "Chair", "commenter": "Комментатор", "composer": "Композитор", "contributor": "Контрибутор", "cosponsor": "Совм. спонсор", "counsel": "Советник", + "creator": "Автор", "director": "Режиссер", "editor": "Редактор", + "executiveProducer": "Executive Producer", "guest": "Гость", + "host": "Host", "interviewee": "Интервью с", "interviewer": "Интервьюер", "inventor": "Изобретатель", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Исполнитель", "podcaster": "Подкастер", "presenter": "Докладчик", @@ -10135,6 +11279,7 @@ "recipient": "Получатель", "reviewedAuthor": "Реценз. автор", "scriptwriter": "Сценарист", + "seriesCreator": "Series Creator", "seriesEditor": "Редактор серии", "sponsor": "Спонсор", "translator": "Переводчик", @@ -10225,6 +11370,7 @@ "edition": "Vydanie", "encyclopediaTitle": "Názov encyklopédie", "episodeNumber": "Číslo epizódy", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Dátum zápisu", "firstPage": "Prvá strana", @@ -10258,11 +11404,19 @@ "numberOfVolumes": "Počet zväzkov", "numPages": "Počet strán", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Strany", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Číslo patentu", "place": "Miesto", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Druh príspevku", "presentationType": "Typ prezentácie", + "priorityDate": "Priority Date", "priorityNumbers": "Čísla priority", "proceedingsTitle": "Názov zborníka", "programmingLanguage": "Program. jazyk", @@ -10286,6 +11440,7 @@ "seriesText": "Text edície", "seriesTitle": "Názov edície", "session": "Zasadnutie", + "sessionTitle": "Session Title", "shortTitle": "Krátky názov", "status": "Status", "studio": "Štúdio", @@ -10309,17 +11464,24 @@ "bookAuthor": "Autor knihy", "cartographer": "Kartograf", "castMember": "Účinkujúci", + "chair": "Chair", "commenter": "Komentátor", "composer": "Skladateľ", "contributor": "Prispievateľ", "cosponsor": "Spolusponzor", "counsel": "Právny zástupca", + "creator": "Autor", "director": "Režisér", "editor": "Zostavovateľ", + "executiveProducer": "Executive Producer", "guest": "Hosť", + "host": "Host", "interviewee": "Rozhovor s", "interviewer": "Spytujúci sa", "inventor": "Vynálezca", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Interpret", "podcaster": "Autor podcastu", "presenter": "Prezentujúci", @@ -10328,6 +11490,7 @@ "recipient": "Príjemca", "reviewedAuthor": "Recenzent", "scriptwriter": "Scenárista", + "seriesCreator": "Series Creator", "seriesEditor": "Zostavovateľ edície", "sponsor": "Navrhovateľ", "translator": "Prekladateľ", @@ -10418,6 +11581,7 @@ "edition": "Edicija", "encyclopediaTitle": "Naslov enciklopedije", "episodeNumber": "Številka epizode", + "eventPlace": "Event Place", "extra": "Dodatno", "filingDate": "Datum vknjižbe", "firstPage": "Naslovnica", @@ -10451,11 +11615,19 @@ "numberOfVolumes": "Št. letnikov", "numPages": "Št. strani", "organization": "Organizacija", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Strani", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Številka patenta", "place": "Kraj", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Vrsta objave", "presentationType": "Vrsta", + "priorityDate": "Priority Date", "priorityNumbers": "Številke prioritete", "proceedingsTitle": "Naslov zapisnika razprave", "programmingLanguage": "Programski jezik", @@ -10479,6 +11651,7 @@ "seriesText": "Besedilo zbirke", "seriesTitle": "Naslov zbirke", "session": "Zasedanje", + "sessionTitle": "Session Title", "shortTitle": "Kratki naslov", "status": "Stanje", "studio": "Studio", @@ -10502,17 +11675,24 @@ "bookAuthor": "Avtor knjige", "cartographer": "Kartograf", "castMember": "Nastopajoči", + "chair": "Chair", "commenter": "Komentator", "composer": "Skladatelj", "contributor": "Avtor prispevka", "cosponsor": "Sosponzor", "counsel": "Odvetnik", + "creator": "Ustvaril", "director": "Režiser", "editor": "Urednik", + "executiveProducer": "Executive Producer", "guest": "Gost", + "host": "Host", "interviewee": "Intervju z", "interviewer": "Intervju opravil", "inventor": "Izumitelj", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Izvajalec", "podcaster": "Avtor podcasta", "presenter": "Predstavitelj", @@ -10521,6 +11701,7 @@ "recipient": "Prejemnik", "reviewedAuthor": "Ocenjeni avtor", "scriptwriter": "Scenarist", + "seriesCreator": "Series Creator", "seriesEditor": "Urednik zbirke", "sponsor": "Sponzor", "translator": "Prevajalec", @@ -10607,10 +11788,11 @@ "distributor": "Дистрибутер", "docketNumber": "Докет број", "documentNumber": "Број документа", - "DOI": "ДОИ", + "DOI": "DOI", "edition": "Едиција", "encyclopediaTitle": "Наслов енциклопедије", "episodeNumber": "Број епизоде", + "eventPlace": "Event Place", "extra": "Додатни подаци", "filingDate": "Датум подношења", "firstPage": "Прва страница", @@ -10621,8 +11803,8 @@ "identifier": "Идентификатор", "institution": "Институција", "interviewMedium": "Медијум", - "ISBN": "ИСБН", - "ISSN": "ИССН", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "Брoj издања", "issueDate": "Датум издања", "issuingAuthority": "Издавач", @@ -10644,11 +11826,19 @@ "numberOfVolumes": "Бр. томова", "numPages": "Брoj страница", "organization": "Организација", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Странице", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Број патента", "place": "Место", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Врста поруке", "presentationType": "Врста", + "priorityDate": "Priority Date", "priorityNumbers": "Бројеви приоритета", "proceedingsTitle": "Наслов зборника", "programmingLanguage": "Прог. језик", @@ -10672,6 +11862,7 @@ "seriesText": "Текст серије", "seriesTitle": "Наслов серије", "session": "Сесија", + "sessionTitle": "Session Title", "shortTitle": "Скраћени наслов", "status": "Стање", "studio": "Студио", @@ -10695,17 +11886,24 @@ "bookAuthor": "Аутор књиге", "cartographer": "Картограф", "castMember": "Глумац", + "chair": "Chair", "commenter": "Коментатор", "composer": "Композитор", "contributor": "Сарадник", "cosponsor": "Коспонзор", "counsel": "Савет", + "creator": "Аутор", "director": "Директор", "editor": "Уредник", + "executiveProducer": "Executive Producer", "guest": "Гост", + "host": "Host", "interviewee": "Разговор са", "interviewer": "Водич интервјуа", "inventor": "Проналазач", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Извођач", "podcaster": "Подкастер", "presenter": "Презентер", @@ -10714,6 +11912,7 @@ "recipient": "Прималац", "reviewedAuthor": "Оцењени аутор", "scriptwriter": "Сценариста", + "seriesCreator": "Series Creator", "seriesEditor": "Уредник серије", "sponsor": "Спонзор", "translator": "Преводилац", @@ -10804,6 +12003,7 @@ "edition": "Upplaga", "encyclopediaTitle": "Uppslagsverkstitel", "episodeNumber": "Avsnittsnummer", + "eventPlace": "Event Place", "extra": "Extra", "filingDate": "Ansökningsdatum", "firstPage": "Första sida", @@ -10837,11 +12037,19 @@ "numberOfVolumes": "# volymer", "numPages": "# sidor", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Sidor", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patentnummer", "place": "Ort", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Källtyp", "presentationType": "Presentationstyp", + "priorityDate": "Priority Date", "priorityNumbers": "Prioritetsnummer", "proceedingsTitle": "Protokolltitel", "programmingLanguage": "Prog. språk", @@ -10865,6 +12073,7 @@ "seriesText": "Bokseries text", "seriesTitle": "Titel på bokserie", "session": "Session", + "sessionTitle": "Session Title", "shortTitle": "Kort titel", "status": "Status", "studio": "Studio", @@ -10888,17 +12097,24 @@ "bookAuthor": "Bokförfattare", "cartographer": "Kartograf", "castMember": "Skådespelare", + "chair": "Chair", "commenter": "Kommentator", "composer": "Kompositör", "contributor": "Medarbetare", "cosponsor": "Medsponsor", "counsel": "Handledare", + "creator": "Skapare", "director": "Regissör", "editor": "Redaktör", + "executiveProducer": "Executive Producer", "guest": "Gäst", + "host": "Host", "interviewee": "Intervju med", "interviewer": "Intervjuare", "inventor": "Uppfinnare", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Artist", "podcaster": "Poddsändare", "presenter": "Presentatör", @@ -10907,6 +12123,7 @@ "recipient": "Mottagare", "reviewedAuthor": "Recenserad författare", "scriptwriter": "Manusförfattare", + "seriesCreator": "Series Creator", "seriesEditor": "Redaktör för bokserie", "sponsor": "Förslagsläggare", "translator": "Översättare", @@ -10993,10 +12210,11 @@ "distributor": "பரப்பி", "docketNumber": "டாக்கெட் எண்", "documentNumber": "ஆவண எண்", - "DOI": "வதே", + "DOI": "DOI", "edition": "பதிப்பு", "encyclopediaTitle": "கலைக்களஞ்சிய தலைப்பு", "episodeNumber": "அத்தியாயம் எண்", + "eventPlace": "Event Place", "extra": "கூடுதல்", "filingDate": "தாக்கல் தேதி", "firstPage": "முதல் பக்கம்", @@ -11007,8 +12225,8 @@ "identifier": "அடையாளங்காட்டி", "institution": "நிறுவனம்", "interviewMedium": "சராசரி", - "ISBN": "ஐஎச்பிஎன்", - "ISSN": "ஐஎச்எச்என்", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "சிக்கல்", "issueDate": "வெளியீட்டு தேதி", "issuingAuthority": "அதிகாரம் வழங்குதல்", @@ -11030,11 +12248,19 @@ "numberOfVolumes": "# தொகுதிகள்", "numPages": "# பக்கங்கள்", "organization": "அமைப்பு", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "பக்கங்கள்", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "காப்புரிமை எண்", "place": "இடம்", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "இடுகை வகை", "presentationType": "வகை", + "priorityDate": "Priority Date", "priorityNumbers": "முன்னுரிமை எண்கள்", "proceedingsTitle": "நடவடிக்கைகள் தலைப்பு", "programmingLanguage": "நிரலாக்க மொழி", @@ -11058,6 +12284,7 @@ "seriesText": "தொடர் உரை", "seriesTitle": "தொடர் தலைப்பு", "session": "அமர்வு", + "sessionTitle": "Session Title", "shortTitle": "குறுகிய தலைப்பு", "status": "நிலை", "studio": "கலைக்கூடம்", @@ -11081,17 +12308,24 @@ "bookAuthor": "புத்தக ஆசிரியர்", "cartographer": "நிலப்படத்தாளர்", "castMember": "நடிக உறுப்பினர்", + "chair": "Chair", "commenter": "வர்ணனையாளர்", "composer": "இசையமைப்பாளர்", "contributor": "பங்களிப்பாளர்", "cosponsor": "இணைபங்களிப்பாளர்", "counsel": "அறிவுரை", + "creator": "உருவாக்கியவர்", "director": "இயக்குனர்", "editor": "திருத்தி", + "executiveProducer": "Executive Producer", "guest": "விருந்தினர்", + "host": "Host", "interviewee": "உடன் நேர்காணல்", "interviewer": "நேர்காணல் செய்பவர்", "inventor": "கண்டுபிடிப்பாளர்", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "நடிகர்", "podcaster": "வலையொளியாளர்", "presenter": "தொகுப்பாளர்", @@ -11100,6 +12334,7 @@ "recipient": "பெறுநர்", "reviewedAuthor": "மதிப்பாய்வு செய்த ஆசிரியர்", "scriptwriter": "திரைக்கதை எழுத்தாளர்", + "seriesCreator": "Series Creator", "seriesEditor": "தொடர் ஆசிரியர்", "sponsor": "ஒப்புரவாளர்", "translator": "மொழிபெயர்", @@ -11190,6 +12425,7 @@ "edition": "ครั้งที่พิมพ์", "encyclopediaTitle": "ชื่อสารานุกรม", "episodeNumber": "ตอนที่", + "eventPlace": "Event Place", "extra": "สิ่งที่เพิ่มเติม", "filingDate": "วันที่เข้าแฟ้ม", "firstPage": "หน้าแรก", @@ -11223,11 +12459,19 @@ "numberOfVolumes": "จำนวนเล่ม", "numPages": "จำนวนหน้า", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "เลขหน้า", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "หมายเลขสิทธิบัตร", "place": "สถานที่พิมพ์", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "ประเภทข้อความ", "presentationType": "ประเภท", + "priorityDate": "Priority Date", "priorityNumbers": "หมายเลขลำดับก่อน", "proceedingsTitle": "ชื่อเอกสารการประชุม", "programmingLanguage": "Prog. Language", @@ -11251,6 +12495,7 @@ "seriesText": "หัวข้อชุด", "seriesTitle": "ชื่อชุด", "session": "สมัยประชุม", + "sessionTitle": "Session Title", "shortTitle": "ชื่อย่อเรื่อง", "status": "Status", "studio": "สตูดิโอ", @@ -11274,17 +12519,24 @@ "bookAuthor": "ผู้แต่งหนังสือ", "cartographer": "ผู้ทำแผนที่", "castMember": "นักแสดง", + "chair": "Chair", "commenter": "ผู้ออกความเห็น", "composer": "นักแต่งเพลง", "contributor": "ผู้ช่วยเหลือ", "cosponsor": "ผู้อุปถัมภ์ร่วม", "counsel": "ทนายความ", + "creator": "ผู้สร้างสรรค์", "director": "ผู้อำนวยการ", "editor": "บรรณาธิการ", + "executiveProducer": "Executive Producer", "guest": "ผู้รับเชิญ", + "host": "Host", "interviewee": "สัมภาษณ์กับ", "interviewer": "ผู้สัมภาษณ์", "inventor": "ผู้ประดิษฐ์", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "นักแสดง", "podcaster": "ผู้สร้างพอดคาสต์", "presenter": "ผู้นำเสนอ", @@ -11293,6 +12545,7 @@ "recipient": "ผู้รับ", "reviewedAuthor": "ผู้เขียนบทวิจารณ์", "scriptwriter": "ผู้เขียนบท", + "seriesCreator": "Series Creator", "seriesEditor": "บรรณาธิการชุดย่อย", "sponsor": "ผู้อุปถัมภ์", "translator": "ผู้แปล", @@ -11383,6 +12636,7 @@ "edition": "Baskı", "encyclopediaTitle": "Ansiklopedi Başlığı", "episodeNumber": "Bölüm Numarası", + "eventPlace": "Event Place", "extra": "İlave", "filingDate": "Başvuru Tarihi", "firstPage": "İlk Sayfa", @@ -11416,13 +12670,21 @@ "numberOfVolumes": "Cilt Sayısı", "numPages": "Sayfa Sayısı", "organization": "Kurum", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Sayfa", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Patent Numarası", "place": "Yayın Yeri", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Post Türü", "presentationType": "Tür", + "priorityDate": "Priority Date", "priorityNumbers": "Rüçhan Numarası", - "proceedingsTitle": "Bildiriler Başlığı", + "proceedingsTitle": "Bildiriler Kitabı Başlığı", "programmingLanguage": "Prog. Dili", "programTitle": "Program Başlığı", "publicationTitle": "Yayın", @@ -11444,6 +12706,7 @@ "seriesText": "Dizi Metni", "seriesTitle": "Dizi Başlığı", "session": "Oturum", + "sessionTitle": "Session Title", "shortTitle": "Kısa Başlık", "status": "Durum", "studio": "Stüdyo", @@ -11457,7 +12720,7 @@ "versionNumber": "Sürüm", "videoRecordingFormat": "Biçim", "volume": "Cilt", - "websiteTitle": "Web sitesi Başlığı", + "websiteTitle": "Web Sitesi Başlığı", "websiteType": "Website Türü" }, "creatorTypes": { @@ -11467,17 +12730,24 @@ "bookAuthor": "Kitap Yazarı", "cartographer": "Haritacı", "castMember": "Oyuncu", + "chair": "Chair", "commenter": "Yorumcu", "composer": "Besteci", "contributor": "Katkıda Bulunan", "cosponsor": "Birlikte Destekleyen", "counsel": "Avukat", + "creator": "Oluşturan", "director": "Yönetmen", "editor": "Editör", + "executiveProducer": "Executive Producer", "guest": "Konuk", + "host": "Host", "interviewee": "Görüşme Yapılan", "interviewer": "Görüşmeci", "inventor": "Buluş Sahibi", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Yorumcu", "podcaster": "Podcast yapan", "presenter": "Sunucu", @@ -11486,6 +12756,7 @@ "recipient": "Alıcı", "reviewedAuthor": "Eleştirilen Yazar", "scriptwriter": "Senaryo Yazarı", + "seriesCreator": "Series Creator", "seriesEditor": "Dizi Editörü", "sponsor": "Destekleyen", "translator": "Çevirmen", @@ -11576,6 +12847,7 @@ "edition": "Видання", "encyclopediaTitle": "Назва енцикл.", "episodeNumber": "Номер епізоду", + "eventPlace": "Event Place", "extra": "Додатково", "filingDate": "Дата заявки", "firstPage": "Перша стор.", @@ -11609,11 +12881,19 @@ "numberOfVolumes": "Кільк. томів", "numPages": "Кільк. сторінок", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Сторінки", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Номер патенту", "place": "Місце", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Тип повідомлення", "presentationType": "Тип", + "priorityDate": "Priority Date", "priorityNumbers": "Номер пріоритету", "proceedingsTitle": "Назва праць", "programmingLanguage": "Prog. Language", @@ -11637,6 +12917,7 @@ "seriesText": "Текст серії", "seriesTitle": "Назва серії", "session": "Сесія", + "sessionTitle": "Session Title", "shortTitle": "Скор. назва", "status": "Status", "studio": "Студія", @@ -11660,17 +12941,24 @@ "bookAuthor": "Автор книги", "cartographer": "Картограф", "castMember": "Актор", + "chair": "Chair", "commenter": "Коментатор", "composer": "Композитор", "contributor": "Співавтор", "cosponsor": "Спонсор", "counsel": "Радник", + "creator": "Автор", "director": "Режисер", "editor": "Редактор", + "executiveProducer": "Executive Producer", "guest": "Гість", + "host": "Host", "interviewee": "Співбесіда з", "interviewer": "Інтерв'юер", "inventor": "Винахідник", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Виконавець", "podcaster": "Підкастер", "presenter": "Доповідач", @@ -11679,6 +12967,7 @@ "recipient": "Отримувач", "reviewedAuthor": "Реценз. автор", "scriptwriter": "Сценарист", + "seriesCreator": "Series Creator", "seriesEditor": "Редактор серії", "sponsor": "Спонсор", "translator": "Перекладач", @@ -11769,6 +13058,7 @@ "edition": "Ấn bản", "encyclopediaTitle": "Tên của Bách Khoa Toàn Thư", "episodeNumber": "Số Hồi", + "eventPlace": "Event Place", "extra": "Phần bổ sung", "filingDate": "Filing Date", "firstPage": "Trang đầu", @@ -11802,11 +13092,19 @@ "numberOfVolumes": "Số Tập", "numPages": "# of Pages", "organization": "Organization", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "Trang", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "Số Bắng sáng chế", "place": "Nơi xuất bản", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "Kiểu Bài viết", "presentationType": "Kiểu", + "priorityDate": "Priority Date", "priorityNumbers": "Số Ưu tiên", "proceedingsTitle": "Nhan đề của Kỷ yếu Hội nghị", "programmingLanguage": "Prog. Language", @@ -11830,6 +13128,7 @@ "seriesText": "Miêu tả Tùng thư", "seriesTitle": "Nhan đề của Tùng thư", "session": "Phiên", + "sessionTitle": "Session Title", "shortTitle": "Nhan đề thu gọn", "status": "Status", "studio": "Xưởng sản xuất", @@ -11853,17 +13152,24 @@ "bookAuthor": "Book Author", "cartographer": "Người vẽ bản đồ", "castMember": "Thành viên đoàn kịch", + "chair": "Chair", "commenter": "Bình luận viên", "composer": "Nhà soạn nhạc", "contributor": "Cộng tác viên", "cosponsor": "Cosponsor", "counsel": "Nhà tư vấn", + "creator": "Người tạo lập", "director": "Đạo diễn", "editor": "Biên tập viên", + "executiveProducer": "Executive Producer", "guest": "Khách mời", + "host": "Host", "interviewee": "Người được phỏng vấn", "interviewer": "Người phỏng vấn", "inventor": "Nhà phát minh", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "Người biểu diễn", "podcaster": "Podcaster", "presenter": "Dẫn chương trình", @@ -11872,6 +13178,7 @@ "recipient": "Người nhận", "reviewedAuthor": "Nhà phê bình/Người phản biện", "scriptwriter": "Tác giả Kịch bản", + "seriesCreator": "Series Creator", "seriesEditor": "Biên tập viên của Tùng thư", "sponsor": "Tài trợ/Đỡ đầu", "translator": "Biên dịch viên", @@ -11930,7 +13237,7 @@ "archiveLocation": "存档位置", "artworkMedium": "艺术品媒介", "artworkSize": "艺术品尺寸", - "assignee": "受让人/所有权人", + "assignee": "专利权人", "audioFileType": "音频文件类型", "audioRecordingFormat": "音频格式", "authority": "主管机构", @@ -11962,12 +13269,13 @@ "edition": "版本", "encyclopediaTitle": "百科标题", "episodeNumber": "集数", + "eventPlace": "Event Place", "extra": "其他", "filingDate": "申请日期", "firstPage": "起始页", "format": "格式", "forumTitle": "论坛/列表服务标题", - "genre": "流派", + "genre": "分类", "history": "历史", "identifier": "识别符", "institution": "机构组织", @@ -11995,17 +13303,25 @@ "numberOfVolumes": "总卷数", "numPages": "总页数", "organization": "组织", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "页码", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "专利号", "place": "地点", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "帖子类型", "presentationType": "演稿类型", - "priorityNumbers": "优先申请号", + "priorityDate": "优先权日", + "priorityNumbers": "优先权号", "proceedingsTitle": "会议论文集标题", "programmingLanguage": "编程语言", "programTitle": "节目名称", - "publicationTitle": "刊名", - "publicLawNumber": "文件号", + "publicationTitle": "出版物", + "publicLawNumber": "公法编号", "publisher": "出版社", "references": "参考文献", "reporter": "报告系统", @@ -12023,6 +13339,7 @@ "seriesText": "系列描述", "seriesTitle": "系列标题", "session": "会期", + "sessionTitle": "Session Title", "shortTitle": "短标题", "status": "状态", "studio": "工作室", @@ -12041,22 +13358,29 @@ }, "creatorTypes": { "artist": "艺术家", - "attorneyAgent": "律师/代理人", + "attorneyAgent": "代理师/机构", "author": "作者", "bookAuthor": "图书作者", "cartographer": "制图人", "castMember": "演员阵容", + "chair": "Chair", "commenter": "评论人", "composer": "创作者", "contributor": "贡献者", "cosponsor": "共同发起人", "counsel": "顾问", + "creator": "创建者", "director": "导演", "editor": "编辑", + "executiveProducer": "Executive Producer", "guest": "宾客", + "host": "主持人", "interviewee": "采访对象", "interviewer": "采访者", "inventor": "发明人", + "narrator": "Narrator", + "organizer": "组织者", + "originalCreator": "Original Creator", "performer": "表演者", "podcaster": "播客", "presenter": "报告人", @@ -12065,6 +13389,7 @@ "recipient": "接收者", "reviewedAuthor": "审稿人", "scriptwriter": "编剧", + "seriesCreator": "系列创作者", "seriesEditor": "丛书编辑", "sponsor": "发起人", "translator": "译者", @@ -12155,6 +13480,7 @@ "edition": "版本", "encyclopediaTitle": "百科全書書名", "episodeNumber": "劇集號碼", + "eventPlace": "Event Place", "extra": "額外增列", "filingDate": "歸檔日期", "firstPage": "起始頁", @@ -12165,8 +13491,8 @@ "identifier": "辨識符號", "institution": "機構", "interviewMedium": "媒介", - "ISBN": "國際標準書號(ISBN)", - "ISSN": "國際標準期刊號(ISSN)", + "ISBN": "ISBN", + "ISSN": "ISSN", "issue": "期號", "issueDate": "發刊日期", "issuingAuthority": "發行當局", @@ -12188,11 +13514,19 @@ "numberOfVolumes": "總卷數", "numPages": "頁數", "organization": "組織", + "originalDate": "Original Date", + "originalPlace": "Original Place", + "originalPublisher": "Original Publisher", "pages": "頁", + "partNumber": "Part Number", + "partTitle": "Part Title", "patentNumber": "專利號", "place": "所在地", + "PMCID": "PMCID", + "PMID": "PMID", "postType": "貼文類型", "presentationType": "類型", + "priorityDate": "Priority Date", "priorityNumbers": "優先權案號", "proceedingsTitle": "會議論文集標題", "programmingLanguage": "程式語言", @@ -12216,6 +13550,7 @@ "seriesText": "系列文", "seriesTitle": "系列標題", "session": "會議時程", + "sessionTitle": "Session Title", "shortTitle": "短名", "status": "狀態", "studio": "工作室", @@ -12239,17 +13574,24 @@ "bookAuthor": "書籍作者", "cartographer": "製圖者", "castMember": "演員陣容", + "chair": "Chair", "commenter": "評論家", "composer": "作曲者", "contributor": "貢獻者", "cosponsor": "共同贊助者", "counsel": "顧問", + "creator": "創作者", "director": "導演", "editor": "編輯者", + "executiveProducer": "Executive Producer", "guest": "來賓", + "host": "Host", "interviewee": "受訪者", "interviewer": "訪談者", "inventor": "發明人", + "narrator": "Narrator", + "organizer": "Organizer", + "originalCreator": "Original Creator", "performer": "表演者", "podcaster": "Podcast主講者", "presenter": "簡報者", @@ -12258,6 +13600,7 @@ "recipient": "領受者", "reviewedAuthor": "所評論的作者", "scriptwriter": "編劇", + "seriesCreator": "Series Creator", "seriesEditor": "系列編輯者", "sponsor": "贊助者", "translator": "翻譯者", From 60e52a316bfb54fb6786bf313b008f0e573e9ce4 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Wed, 14 Jan 2026 09:16:23 +0100 Subject: [PATCH 61/75] Show collections and library in item detail (#1227) --- Zotero/Assets/en.lproj/Localizable.strings | 2 + .../Controllers/CollectionTreeBuilder.swift | 72 +++++++++- Zotero/Models/Collection.swift | 40 +++--- Zotero/Models/CollectionTree.swift | 78 ++++++++++- Zotero/Models/Predicates.swift | 5 + Zotero/Scenes/Detail/DetailCoordinator.swift | 14 ++ .../ItemDetail/ItemDetailDataCreator.swift | 33 ++++- .../ItemDetail/Models/ItemDetailAction.swift | 1 + .../ItemDetail/Models/ItemDetailError.swift | 1 + .../ItemDetail/Models/ItemDetailLayout.swift | 2 +- .../ItemDetail/Models/ItemDetailState.swift | 4 + .../ViewModels/ItemDetailActionHandler.swift | 32 +++++ .../ItemDetailCollectionViewHandler.swift | 129 +++++++++++++++--- .../Views/ItemDetailViewController.swift | 6 + .../Main/Views/MainViewController.swift | 8 +- .../Views/CollectionCellContentView.swift | 2 + ...ableCollectionsCollectionViewHandler.swift | 4 - Zotero/Scenes/Master/MasterCoordinator.swift | 8 +- 18 files changed, 383 insertions(+), 58 deletions(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 89d5c2e48..44a58829b 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -203,6 +203,7 @@ "item_detail.deleted_title" = "Deleted"; "item_detail.deleted_message" = "This item has been deleted. Do you want to restore it?"; "item_detail.move_to_standalone_attachment" = "Convert to Standalone Attachment"; +"item_detail.libraries_and_collections" = "Libraries and Collections"; "tag_picker.title" = "%d selected"; "tag_picker.placeholder" = "Tag name"; @@ -455,6 +456,7 @@ "errors.item_detail.cant_save_changes" = "Could not save changes"; "errors.item_detail.cant_trash_item" = "Could not move item to trash"; "errors.item_detail.cant_save_tags" = "Could not save tags"; +"errors.item_detail.cant_remove_collection" = "Could not remove item from collection."; "errors.item_detail.unsupported_type" = "Type \"%@\" not supported"; "errors.settings.storage" = "Could not collect storage data"; "errors.settings.webdav.file_missing_after_upload" = "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."; diff --git a/Zotero/Controllers/CollectionTreeBuilder.swift b/Zotero/Controllers/CollectionTreeBuilder.swift index daa0edfd5..4e63e18f3 100644 --- a/Zotero/Controllers/CollectionTreeBuilder.swift +++ b/Zotero/Controllers/CollectionTreeBuilder.swift @@ -8,6 +8,7 @@ import Foundation +import CocoaLumberjackSwift import RealmSwift struct CollectionTreeBuilder { @@ -29,8 +30,75 @@ struct CollectionTreeBuilder { return CollectionTree(nodes: nodes, collections: collections, collapsed: collapsed) } - private static func collections(for parent: CollectionIdentifier?, from rCollections: Results, libraryId: LibraryIdentifier, includeItemCounts: Bool, - allCollections: inout [CollectionIdentifier: Collection], collapsedState: inout [CollectionIdentifier: Bool]) -> [CollectionTree.Node] { + static func collections(from rItem: RItem, allCollections allRCollections: Results) -> CollectionTree { + guard let libraryId = rItem.libraryId else { + DDLogError("CollectionTreeBuilder: tried creating tree from item with no library \(rItem.key)") + return CollectionTree(nodes: [], collections: [:], collapsed: [:]) + } + + var collections: [CollectionIdentifier: Collection] = [:] + var rootIds: Set = [] + var allChildren: [CollectionIdentifier: [CollectionIdentifier]] = [:] + var stack = Array(rItem.collections.filter(.notTrashedOrDeleted).map({ Collection(object: $0, isAvailable: true) })) + while let collection = stack.popLast() { + guard let key = collection.id.key else { + DDLogInfo("CollectionTreeBuilder: creating tree from non-collection - \(collection.id)") + continue + } + if let existingCollection = collections[collection.id] { + // Only process collections which were not processed yet, but if a collection has been processed and the `isAvailable` flag isn't set properly, update collection + if !existingCollection.isAvailable && collection.isAvailable { + collections[collection.id] = collection + } + continue + } + guard let rCollection = allRCollections.filter(.key(key, in: libraryId)).first else { + DDLogInfo("CollectionTreeBuilder: item contained collection not in all collections results - \(collection.id)") + continue + } + collections[collection.id] = collection + if let parentKey = rCollection.parentKey { + guard let rParent = allRCollections.filter(.key(parentKey, in: libraryId)).first else { + DDLogError("CollectionTreeBuilder: parent missing in all collections - \(parentKey), \(libraryId)") + continue + } + allChildren[.collection(parentKey), default: []].append(collection.id) + stack.append(Collection(object: rParent, isAvailable: false)) + } else { + rootIds.insert(.collection(key)) + } + } + + var nodes: [CollectionTree.Node] = [] + for id in rootIds { + let node = buildNode(identifier: id, parentId: nil) + let index = insertionIndex(for: node, in: nodes, collections: collections) + nodes.insert(node, at: index) + } + + return CollectionTree(nodes: nodes, collections: collections, collapsed: [:]) + + func buildNode(identifier: CollectionIdentifier, parentId: CollectionIdentifier?) -> CollectionTree.Node { + var childNodes: [CollectionTree.Node] = [] + if let children = allChildren[identifier] { + for childId in children { + let node = buildNode(identifier: childId, parentId: identifier) + let index = insertionIndex(for: node, in: childNodes, collections: collections) + childNodes.insert(node, at: index) + } + } + return CollectionTree.Node(identifier: identifier, parent: parentId, children: childNodes) + } + } + + private static func collections( + for parent: CollectionIdentifier?, + from rCollections: Results, + libraryId: LibraryIdentifier, + includeItemCounts: Bool, + allCollections: inout [CollectionIdentifier: Collection], + collapsedState: inout [CollectionIdentifier: Bool] + ) -> [CollectionTree.Node] { var nodes: [CollectionTree.Node] = [] for rCollection in rCollections.filter(parent?.key.flatMap({ .parentKey($0) }) ?? .parentKeyNil) { let collection = self.collection(from: rCollection, libraryId: libraryId, includeItemCounts: includeItemCounts) diff --git a/Zotero/Models/Collection.swift b/Zotero/Models/Collection.swift index 9439fa5c1..1e314a0b5 100644 --- a/Zotero/Models/Collection.swift +++ b/Zotero/Models/Collection.swift @@ -14,13 +14,14 @@ struct Collection: Identifiable, Equatable, Hashable { let identifier: CollectionIdentifier let name: String var itemCount: Int + let isAvailable: Bool var id: CollectionIdentifier { - return self.identifier + return identifier } var iconName: String { - switch self.identifier { + switch identifier { case .collection: return Asset.Images.Cells.collection.name @@ -41,44 +42,49 @@ struct Collection: Identifiable, Equatable, Hashable { } } - init(object: RCollection, itemCount: Int) { - self.identifier = .collection(object.key) - self.name = object.name + init(object: RCollection, itemCount: Int = 0, isAvailable: Bool = true) { + identifier = .collection(object.key) + name = object.name self.itemCount = itemCount + self.isAvailable = isAvailable } init(object: RSearch) { - self.identifier = .search(object.key) - self.name = object.name - self.itemCount = 0 + identifier = .search(object.key) + name = object.name + itemCount = 0 + isAvailable = true } init(custom type: CollectionIdentifier.CustomType, itemCount: Int = 0) { self.itemCount = itemCount - self.identifier = .custom(type) + identifier = .custom(type) + isAvailable = true + switch type { case .all: - self.name = L10n.Collections.allItems + name = L10n.Collections.allItems case .publications: - self.name = L10n.Collections.myPublications + name = L10n.Collections.myPublications case .trash: - self.name = L10n.Collections.trash + name = L10n.Collections.trash case .unfiled: - self.name = L10n.Collections.unfiled + name = L10n.Collections.unfiled } } - private init(identifier: CollectionIdentifier, name: String, itemCount: Int) { + private init(identifier: CollectionIdentifier, name: String, itemCount: Int, isAvailable: Bool) { self.identifier = identifier self.name = name self.itemCount = itemCount + self.isAvailable = isAvailable } func isCustom(type: CollectionIdentifier.CustomType) -> Bool { - switch self.identifier { + switch identifier { case .custom(let customType): return type == customType @@ -88,7 +94,7 @@ struct Collection: Identifiable, Equatable, Hashable { } var isCollection: Bool { - switch self.identifier { + switch identifier { case .collection: return true @@ -98,6 +104,6 @@ struct Collection: Identifiable, Equatable, Hashable { } func copy(with itemCount: Int) -> Collection { - return Collection(identifier: self.identifier, name: self.name, itemCount: itemCount) + return Collection(identifier: identifier, name: name, itemCount: itemCount, isAvailable: isAvailable) } } diff --git a/Zotero/Models/CollectionTree.swift b/Zotero/Models/CollectionTree.swift index a7e2de98f..4456ebf38 100644 --- a/Zotero/Models/CollectionTree.swift +++ b/Zotero/Models/CollectionTree.swift @@ -8,8 +8,8 @@ import UIKit -final class CollectionTree { - struct Node: Hashable { +final class CollectionTree: Equatable { + struct Node: Hashable, Equatable { let identifier: CollectionIdentifier let parent: CollectionIdentifier? let children: [Node] @@ -36,6 +36,10 @@ final class CollectionTree { self.collapsed = collapsed self.filtered = [:] } + + static func == (lhs: CollectionTree, rhs: CollectionTree) -> Bool { + return lhs.nodes == rhs.nodes + } } // MARK: - Editing @@ -52,6 +56,49 @@ extension CollectionTree { self.collapsed[collection.identifier] = collapsed self.nodes.insert(Node(identifier: collection.identifier, parent: nil, children: []), at: index) } + + func remove(identifier: CollectionIdentifier) { + let idsToRemove = idsToRemove(for: identifier) + let newNodes = remove(identifier: identifier, in: nodes) + nodes = newNodes + + for id in idsToRemove { + collections[id] = nil + collapsed[id] = nil + filtered[id] = nil + } + + func remove(identifier: CollectionIdentifier, in array: [Node]) -> [Node] { + return array.compactMap { node in + guard node.identifier != identifier else { return nil } + let children = remove(identifier: identifier, in: node.children) + if children.isEmpty, let collection = collections[node.identifier], !collection.isAvailable { + return nil + } + return Node(identifier: node.identifier, parent: node.parent, children: children) + } + } + + func idsToRemove(for identifier: CollectionIdentifier) -> [CollectionIdentifier] { + var node: Node? + var queue: [Node] = nodes + while !queue.isEmpty { + let current = queue.removeFirst() + if current.identifier == identifier { + node = current + break + } + queue.append(contentsOf: current.children) + } + + guard let node else { return [] } + return allIdentifiers(from: node) + + func allIdentifiers(from node: Node) -> [CollectionIdentifier] { + return [node.identifier] + node.children.flatMap({ allIdentifiers(from: $0) }) + } + } + } } // MARK: - Data Source @@ -170,23 +217,42 @@ extension CollectionTree { // MARK: - Diffable Data Source extension CollectionTree { - func createSnapshot(selectedId: CollectionIdentifier? = nil, collapseState: CollapseState = .basedOnDb) -> NSDiffableDataSourceSectionSnapshot { + func createSnapshot( + selectedId: CollectionIdentifier? = nil, + collapseState: CollapseState = .basedOnDb + ) -> NSDiffableDataSourceSectionSnapshot { var snapshot = NSDiffableDataSourceSectionSnapshot() self.add(nodes: self.nodes, to: nil, in: &snapshot, allCollections: self.collections) self.apply(selectedId: selectedId, collapseState: collapseState, to: &snapshot) return snapshot } + + func createSnapshot(parent: Result? = nil, resultTransformer: (Collection) -> Result = { $0 }) -> NSDiffableDataSourceSectionSnapshot { + var snapshot = NSDiffableDataSourceSectionSnapshot() + if let parent { + snapshot.append([parent]) + } + self.add(nodes: self.nodes, to: parent, in: &snapshot, allCollections: self.collections, resultTransformer: resultTransformer) + snapshot.expand(snapshot.items) + return snapshot + } - private func add(nodes: [Node], to parent: T?, in snapshot: inout NSDiffableDataSourceSectionSnapshot, allCollections: [CollectionIdentifier: T]) { + private func add( + nodes: [Node], + to parent: Transformed?, + in snapshot: inout NSDiffableDataSourceSectionSnapshot, + allCollections: [CollectionIdentifier: Result], + resultTransformer: (Result) -> Transformed = { (result: Result) in result } + ) { guard !nodes.isEmpty else { return } let collections = nodes.map({ allCollections[$0.identifier] }) - snapshot.append(collections.compactMap({ $0 }), to: parent) + snapshot.append(collections.compactMap({ $0 }).map(resultTransformer), to: parent) for (idx, collection) in collections.enumerated() { guard let collection = collection else { continue } let node = nodes[idx] - self.add(nodes: node.children, to: collection, in: &snapshot, allCollections: allCollections) + self.add(nodes: node.children, to: resultTransformer(collection), in: &snapshot, allCollections: allCollections, resultTransformer: resultTransformer) } } diff --git a/Zotero/Models/Predicates.swift b/Zotero/Models/Predicates.swift index ba356ae62..9b50e41b2 100644 --- a/Zotero/Models/Predicates.swift +++ b/Zotero/Models/Predicates.swift @@ -219,6 +219,11 @@ extension NSPredicate { let predicates: [NSPredicate] = [.library(with: libraryId), .deleted(false), .isTrash(true), .notSyncState(.dirty)] return NSCompoundPredicate(andPredicateWithSubpredicates: predicates) } + + static var notTrashedOrDeleted: NSPredicate { + let predicates: [NSPredicate] = [.deleted(false), .isTrash(false), .notSyncState(.dirty)] + return NSCompoundPredicate(andPredicateWithSubpredicates: predicates) + } private static func baseItemPredicates(isTrash: Bool, libraryId: LibraryIdentifier) -> [NSPredicate] { var predicates: [NSPredicate] = [.library(with: libraryId), .notSyncState(.dirty), .deleted(false), .isTrash(isTrash)] diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 9334f6cc7..501adc0fb 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -66,6 +66,8 @@ protocol DetailItemDetailCoordinatorDelegate: AnyObject { func show(error: ItemDetailError, viewModel: ViewModel) func showDataReloaded(completion: @escaping () -> Void) func showAttachment(key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) + func show(collection: Collection, libraryId: LibraryIdentifier) + func show(library: LibraryIdentifier) } protocol DetailNoteEditorCoordinatorDelegate: AnyObject { @@ -1056,6 +1058,10 @@ extension DetailCoordinator: DetailItemDetailCoordinatorDelegate { case .cantRemoveItem, .cantRemoveParent: title = L10n.error message = L10n.Errors.unknown + + case .cantRemoveCollection: + title = L10n.error + message = L10n.Errors.ItemDetail.cantRemoveCollection } let controller = UIAlertController(title: title, message: message, preferredStyle: .alert) @@ -1078,6 +1084,14 @@ extension DetailCoordinator: DetailItemDetailCoordinatorDelegate { })) self.navigationController?.present(controller, animated: true, completion: nil) } + + func show(collection: Collection, libraryId: LibraryIdentifier) { + (navigationController?.splitViewController as? MainViewController)?.masterCoordinator?.showCollections(for: libraryId, preselectedCollection: collection.identifier, animated: true) + } + + func show(library: LibraryIdentifier) { + (navigationController?.splitViewController as? MainViewController)?.masterCoordinator?.showCollections(for: libraryId, preselectedCollection: .custom(.all), animated: true) + } } extension DetailCoordinator: DetailNoteEditorCoordinatorDelegate { diff --git a/Zotero/Scenes/Detail/ItemDetail/ItemDetailDataCreator.swift b/Zotero/Scenes/Detail/ItemDetail/ItemDetailDataCreator.swift index 45b5fb796..1dddc1ef7 100644 --- a/Zotero/Scenes/Detail/ItemDetail/ItemDetailDataCreator.swift +++ b/Zotero/Scenes/Detail/ItemDetail/ItemDetailDataCreator.swift @@ -10,6 +10,7 @@ import Foundation import OrderedCollections import CocoaLumberjackSwift +import RealmSwift struct ItemDetailDataCreator { enum Kind { @@ -27,6 +28,8 @@ struct ItemDetailDataCreator { /// - returns: Populated data for given type. static func createData( from type: Kind, + library: Library, + collections: Results, schemaController: SchemaController, dateParser: DateParser, fileStorage: FileStorage, @@ -36,11 +39,21 @@ struct ItemDetailDataCreator { ) throws -> (ItemDetailState.Data, [Attachment], [Note], [Tag]) { switch type { case .new(let itemType, let child): - return try creationData(itemType: itemType, child: child, schemaController: schemaController, dateParser: dateParser, urlDetector: urlDetector, doiDetector: doiDetector) + return try creationData( + itemType: itemType, + child: child, + library: library, + schemaController: schemaController, + dateParser: dateParser, + urlDetector: urlDetector, + doiDetector: doiDetector + ) case .existing(let item, let ignoreChildren): return try itemData( item: item, + collections: collections, + library: library, ignoreChildren: ignoreChildren, schemaController: schemaController, dateParser: dateParser, @@ -59,8 +72,14 @@ struct ItemDetailDataCreator { /// - parameter urlDetector: URL detector. /// - parameter doiDetector: DOI detector. /// - returns: Data for item detail state. - private static func creationData(itemType: String, child: Attachment?, schemaController: SchemaController, dateParser: DateParser, urlDetector: UrlDetector, - doiDetector: (String) -> Bool) throws -> (ItemDetailState.Data, [Attachment], [Note], [Tag]) { + private static func creationData( + itemType: String, + child: Attachment?, + library: Library, + schemaController: SchemaController, + dateParser: DateParser, urlDetector: UrlDetector, + doiDetector: (String) -> Bool + ) throws -> (ItemDetailState.Data, [Attachment], [Note], [Tag]) { guard let localizedType = schemaController.localized(itemType: itemType) else { DDLogError("ItemDetailDataCreator: schema not initialized - can't create localized type") throw ItemDetailError.cantCreateData @@ -76,6 +95,8 @@ struct ItemDetailDataCreator { creators: [:], fields: fields, abstract: (hasAbstract ? "" : nil), + library: library, + collections: nil, dateModified: date, dateAdded: date ) @@ -94,6 +115,8 @@ struct ItemDetailDataCreator { /// - returns: Data for item detail state. private static func itemData( item: RItem, + collections: Results, + library: Library, ignoreChildren: Bool, schemaController: SchemaController, dateParser: DateParser, @@ -165,6 +188,8 @@ struct ItemDetailDataCreator { }) attachments = Array(mappedAttachments) } + + let collectionTree = CollectionTreeBuilder.collections(from: item, allCollections: collections) let tags = item.tags.sorted(byKeyPath: "tag.name").map(Tag.init) let data = ItemDetailState.Data( @@ -174,6 +199,8 @@ struct ItemDetailDataCreator { creators: creators, fields: fields, abstract: abstract, + library: library, + collections: collectionTree, dateModified: item.dateModified, dateAdded: item.dateAdded ) diff --git a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailAction.swift b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailAction.swift index df99f805b..f5a5e1a7e 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailAction.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailAction.swift @@ -17,6 +17,7 @@ enum ItemDetailAction { case deleteAttachmentFile(Attachment) case deleteAttachment(Attachment) case deleteCreator(String) + case deleteCollection(CollectionIdentifier) case deleteNote(key: String) case deleteTag(Tag) case endEditing diff --git a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailError.swift b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailError.swift index 259abf576..88b21e9b7 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailError.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailError.swift @@ -25,4 +25,5 @@ enum ItemDetailError: Error, Equatable, Hashable { case cantSaveTags case cantRemoveItem case cantRemoveParent + case cantRemoveCollection } diff --git a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailLayout.swift b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailLayout.swift index 8e890f3b9..1b789e00f 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailLayout.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailLayout.swift @@ -56,7 +56,7 @@ struct ItemDetailLayout { top = 15 bottom = 15 - case .attachments, .notes, .tags: + case .attachments, .notes, .tags, .collections: top = isLastRow ? 2 : 15 bottom = isLastRow ? 2 : 15 diff --git a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailState.swift b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailState.swift index d5d5b6c87..630001375 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailState.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Models/ItemDetailState.swift @@ -183,6 +183,8 @@ struct ItemDetailState: ViewModelState { var creators: OrderedDictionary var fields: OrderedDictionary var abstract: String? + var library: Library + var collections: CollectionTree? var dateModified: Date let dateAdded: Date @@ -230,6 +232,8 @@ struct ItemDetailState: ViewModelState { creators: [:], fields: [:], abstract: nil, + library: Library(identifier: .custom(.myLibrary), name: L10n.Libraries.myLibrary, metadataEditable: true, filesEditable: true), + collections: nil, dateModified: date, dateAdded: date ) diff --git a/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift b/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift index 41db93172..c1f4e3f8a 100644 --- a/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/ViewModels/ItemDetailActionHandler.swift @@ -153,6 +153,9 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess case .moveAttachmentToStandalone(let attachment): self.moveToStandalone(attachment: attachment, in: viewModel) + + case .deleteCollection(let identifier): + deleteCollection(identifier: identifier, in: viewModel) } } @@ -167,6 +170,7 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess guard let self, let viewModel else { return } reloadData(isEditing: viewModel.state.isEditing, library: library, in: viewModel) }) + let collections = try self.dbStorage.perform(request: ReadCollectionsDbRequest(libraryId: library.identifier), on: .main) update(viewModel: viewModel) { state in state.libraryToken = libraryToken @@ -177,6 +181,8 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess collectionsSource = _collectionsSource data = try ItemDetailDataCreator.createData( from: .new(itemType: itemType, child: child), + library: library, + collections: collections, schemaController: self.schemaController, dateParser: self.dateParser, fileStorage: self.fileStorage, @@ -190,6 +196,8 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess let item = try self.dbStorage.perform(request: ReadItemDbRequest(libraryId: library.identifier, key: itemKey), on: .main) data = try ItemDetailDataCreator.createData( from: .existing(item: item, ignoreChildren: true), + library: library, + collections: collections, schemaController: self.schemaController, dateParser: self.dateParser, fileStorage: self.fileStorage, @@ -242,6 +250,7 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess do { let canEdit = isEditing && library.metadataEditable let item = try self.dbStorage.perform(request: ReadItemDbRequest(libraryId: viewModel.state.library.identifier, key: viewModel.state.key), on: .main, refreshRealm: true) + let collections = try self.dbStorage.perform(request: ReadCollectionsDbRequest(libraryId: library.identifier), on: .main) let token = item.observe(keyPaths: RItem.observableKeypathsForItemDetail) { [weak viewModel] change in guard let viewModel = viewModel else { return } @@ -250,6 +259,8 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess let (data, attachments, notes, tags) = try ItemDetailDataCreator.createData( from: .existing(item: item, ignoreChildren: false), + library: library, + collections: collections, schemaController: self.schemaController, dateParser: self.dateParser, fileStorage: self.fileStorage, @@ -661,6 +672,27 @@ final class ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcess } } } + + // MARK: - Collections + + private func deleteCollection(identifier: CollectionIdentifier, in viewModel: ViewModel) { + guard let key = identifier.key else { return } + let request = DeleteItemsFromCollectionDbRequest(collectionKey: key, itemKeys: [viewModel.state.key], libraryId: viewModel.state.library.identifier) + perform(request: request) { [weak self, weak viewModel] error in + guard let self, let viewModel else { return } + if let error = error { + DDLogError("ItemDetailActionHandler: can't remove from collection - \(error)") + update(viewModel: viewModel) { state in + state.error = .cantRemoveCollection + } + } else { + update(viewModel: viewModel) { state in + state.data.collections?.remove(identifier: identifier) + state.reload = .section(.collections) + } + } + } + } // MARK: - Editing diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift index 47db98b88..9da46e823 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailCollectionViewHandler.swift @@ -32,6 +32,8 @@ final class ItemDetailCollectionViewHandler: NSObject { case openFilePicker case openUrl(String) case openDoi(String) + case openCollection(Collection) + case openLibrary(Library) } /// Sections that are shown in `tableView`. @@ -45,6 +47,7 @@ final class ItemDetailCollectionViewHandler: NSObject { case tags case title case type + case collections } /// `UICollectionViewDiffableDataSource` has a bug where it doesn't reload sections which are in `reloadSections` of its snapshot, but if sections are actually different, the snapshot will reload them. @@ -61,10 +64,12 @@ final class ItemDetailCollectionViewHandler: NSObject { case addTag case abstract case attachment(attachment: Attachment, type: ItemDetailAttachmentCell.Kind) + case collection(Collection) case creator(ItemDetailState.Creator) case dateAdded(Date) case dateModified(Date) case field(key: String, multiline: Bool) + case library(Library) case note(key: String, title: String, isProcessing: Bool) case tag(id: UUID, tag: Tag, isProcessing: Bool) case title @@ -175,6 +180,8 @@ final class ItemDetailCollectionViewHandler: NSObject { let noteRegistration = self.noteRegistration let tagRegistration = self.tagRegistration let attachmentRegistration = self.attachmentRegistration + let libraryRegistration = self.libraryRegistration + let collectionRegistration = self.collectionRegistration dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView, cellProvider: { [weak self] collectionView, indexPath, row in guard let self else { return collectionView.dequeueConfiguredReusableCell(using: emptyRegistration, for: indexPath, item: ()) } @@ -239,6 +246,12 @@ final class ItemDetailCollectionViewHandler: NSObject { case .type(let type): return collectionView.dequeueConfiguredReusableCell(using: fieldRegistration, for: indexPath, item: (.value(value: type, title: L10n.itemType), titleWidth)) + + case .collection(let collection): + return collectionView.dequeueConfiguredReusableCell(using: collectionRegistration, for: indexPath, item: collection) + + case .library(let library): + return collectionView.dequeueConfiguredReusableCell(using: libraryRegistration, for: indexPath, item: library) } }) @@ -310,6 +323,9 @@ final class ItemDetailCollectionViewHandler: NSObject { case .tags: view.setup(with: L10n.ItemDetail.tags) + case .collections: + view.setup(with: L10n.ItemDetail.librariesAndCollections) + default: break } } @@ -339,7 +355,7 @@ final class ItemDetailCollectionViewHandler: NSObject { func createHeader(for section: Section) -> NSCollectionLayoutBoundarySupplementaryItem? { switch section { - case .attachments, .tags, .notes: + case .attachments, .tags, .notes, .collections: let height = ItemDetailLayout.sectionHeaderHeight - ItemDetailLayout.separatorHeight return NSCollectionLayoutBoundarySupplementaryItem( layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(height)), @@ -369,6 +385,9 @@ final class ItemDetailCollectionViewHandler: NSObject { case .creator where self.viewModel.state.isEditing: title = L10n.delete + + case .collection(let collection) where collection.isAvailable: + title = L10n.delete default: return nil @@ -396,8 +415,11 @@ final class ItemDetailCollectionViewHandler: NSObject { case .note(let key, _, _): self.viewModel.process(action: .deleteNote(key: key)) + + case .collection(let collection): + self.viewModel.process(action: .deleteCollection(collection.identifier)) - case .title, .abstract, .addAttachment, .addCreator, .addNote, .addTag, .dateAdded, .dateModified, .type, .field: + case .title, .abstract, .addAttachment, .addCreator, .addNote, .addTag, .dateAdded, .dateModified, .type, .field, .library: break } } @@ -427,7 +449,7 @@ final class ItemDetailCollectionViewHandler: NSObject { case .type, .fields, .creators: return isEditing - case .attachments, .notes, .tags: + case .attachments, .notes, .tags, .collections: return !isLastRow case .dates: @@ -437,7 +459,7 @@ final class ItemDetailCollectionViewHandler: NSObject { func separatorLeftInset(for section: Section) -> CGFloat { switch section { - case .notes, .attachments, .tags: + case .notes, .attachments, .tags, .collections: return ItemDetailLayout.iconWidth + ItemDetailLayout.horizontalInset + 17 case .abstract, .creators, .dates, .fields, .title, .type: @@ -469,14 +491,30 @@ final class ItemDetailCollectionViewHandler: NSObject { if #available(iOS 26.0, *) { snapshot.reloadSections(sections) } + var collectionsSection: SectionType? for section in sections { - snapshot.appendItems(rows(for: section.section, state: state), toSection: section) + if section.section == .collections { + collectionsSection = section + } else { + snapshot.appendItems(rows(for: section.section, state: state), toSection: section) + } } - dataSource.apply(snapshot, animatingDifferences: animated) { [weak self] in + let reloadCompletion: () -> Void = { [weak self] in // Setting isEditing will trigger reconfiguration of cells, before the new snapshot has been applied, so it is done afterwards to avoid e.g. flickering the old text in a text view. self?.collectionView.isEditing = state.isEditing completion?() } + dataSource.apply(snapshot, animatingDifferences: animated) { + guard collectionsSection == nil else { return } + reloadCompletion() + } + if let collectionsSection { + if let snapshot = state.data.collections?.createSnapshot(parent: .library(state.library), resultTransformer: { Row.collection($0) }) { + dataSource.apply(snapshot, to: collectionsSection, animatingDifferences: true, completion: reloadCompletion) + } else { + reloadCompletion() + } + } } /// Creates array of visible sections for current state data. @@ -521,6 +559,7 @@ final class ItemDetailCollectionViewHandler: NSObject { if library.metadataAndFilesEditable || !state.attachments.isEmpty { sections.append(.attachments) } + sections.append(.collections) return sections } @@ -543,18 +582,24 @@ final class ItemDetailCollectionViewHandler: NSObject { guard let self else { return } var snapshot = dataSource.snapshot() guard let sectionType = snapshot.sectionIdentifiers.first(where: { $0.section == section }) else { return } - - let oldRows = snapshot.itemIdentifiers(inSection: sectionType) - let newRows = rows(for: section, state: state) - snapshot.deleteItems(oldRows) - snapshot.appendItems(newRows, toSection: sectionType) - - let toReload = rowsToReload(from: oldRows, to: newRows, in: section) - if !toReload.isEmpty { - snapshot.reconfigureItems(toReload) + + if case .collections = section { + // Collections section is nested, requires separate handling + if let subSnapshot = state.data.collections?.createSnapshot(parent: .library(state.library), resultTransformer: { Row.collection($0) }) { + dataSource.apply(subSnapshot, to: sectionType, animatingDifferences: true) + } + } else { + // Only handle rows for sections which are not nested + let oldRows = snapshot.itemIdentifiers(inSection: sectionType) + let newRows = rows(for: section, state: state) + snapshot.deleteItems(oldRows) + snapshot.appendItems(newRows, toSection: sectionType) + let toReload = rowsToReload(from: oldRows, to: newRows, in: section) + if !toReload.isEmpty { + snapshot.reconfigureItems(toReload) + } + dataSource.apply(snapshot, animatingDifferences: animated) } - - dataSource.apply(snapshot, animatingDifferences: animated) } /// Returns an array of rows which need to be reloaded manually. Some sections are "special" because their rows don't hold the values which they show in collection view, they just hold their @@ -734,6 +779,10 @@ final class ItemDetailCollectionViewHandler: NSObject { case .type: return [.type(state.data.localizedType)] + + case .collections: + // This section is handled separately + return [] } } @@ -788,6 +837,28 @@ final class ItemDetailCollectionViewHandler: NSObject { } // MARK: - Cells + + private lazy var libraryRegistration: UICollectionView.CellRegistration = { + return UICollectionView.CellRegistration { [weak self] cell, _, library in + var configuration = CollectionCell.LibraryContentConfiguration(name: library.name, accessories: []) + cell.contentConfiguration = configuration + cell.backgroundConfiguration = .listPlainCell() + } + }() + + private lazy var collectionRegistration: UICollectionView.CellRegistration = { + return UICollectionView.CellRegistration { [weak self] cell, _, collection in + guard let self, let sectionType = self.dataSource.snapshot().sectionIdentifiers.first(where: { $0.section == .collections }) else { return } + + let snapshot = self.dataSource.snapshot(for: sectionType) + let hasChildren = snapshot.contains(.collection(collection)) && !snapshot.snapshot(of: .collection(collection), includingParent: false).items.isEmpty + var configuration = CollectionCell.ContentConfiguration(collection: collection, hasChildren: hasChildren, accessories: []) + configuration.isCollapsedProvider = { false } + + cell.contentConfiguration = configuration + cell.backgroundConfiguration = .listPlainCell() + } + }() private lazy var titleRegistration: UICollectionView.CellRegistration = { return UICollectionView.CellRegistration { [weak self] cell, indexPath, data in @@ -950,6 +1021,14 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { break } + case .collection(let collection): + guard !viewModel.state.isEditing else { return } + observer.on(.next(.openCollection(collection))) + + case .library(let library): + guard !viewModel.state.isEditing else { return } + observer.on(.next(.openLibrary(library))) + case .title, .dateAdded, .dateModified, .tag: break } @@ -993,6 +1072,9 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { case .note(let key, _, _): menu = createContextMenuForNote(key: key) + + case .collection(let collection) where collection.isAvailable: + menu = createContextMenu(for: collection) default: return nil @@ -1009,7 +1091,7 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { }) } - if !viewModel.state.data.isAttachment, !viewModel.state.isTrash { + if viewModel.state.library.metadataEditable, !viewModel.state.data.isAttachment, !viewModel.state.isTrash { if case .file = attachment.type { actions.append(UIAction(title: L10n.ItemDetail.moveToStandaloneAttachment, image: UIImage(systemName: "arrow.up.to.line"), attributes: []) { [weak self] _ in self?.viewModel.process(action: .moveAttachmentToStandalone(attachment)) @@ -1025,6 +1107,7 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { } func createContextMenuForNote(key: String) -> UIMenu? { + guard viewModel.state.library.metadataEditable else { return nil } var actions: [UIAction] = [] actions.append(UIAction(title: L10n.moveToTrash, image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in self?.viewModel.process(action: .deleteNote(key: key)) @@ -1033,6 +1116,7 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { } func createContextMenu(for tag: Tag) -> UIMenu? { + guard viewModel.state.library.metadataEditable else { return nil } var actions: [UIAction] = [] actions.append(UIAction(title: L10n.delete, image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in self?.viewModel.process(action: .deleteTag(tag)) @@ -1046,5 +1130,14 @@ extension ItemDetailCollectionViewHandler: UICollectionViewDelegate { UIPasteboard.general.string = field.value })]) } + + func createContextMenu(for collection: Collection) -> UIMenu? { + guard viewModel.state.library.metadataEditable else { return nil } + var actions: [UIAction] = [] + actions.append(UIAction(title: L10n.delete, image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in + self?.viewModel.process(action: .deleteCollection(collection.id)) + }) + return UIMenu(title: "", children: actions) + } } } diff --git a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift index ff1bf366c..74f0070ad 100644 --- a/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift +++ b/Zotero/Scenes/Detail/ItemDetail/Views/ItemDetailViewController.swift @@ -209,6 +209,12 @@ final class ItemDetailViewController: UIViewController { case .openDoi(let doi): guard let encoded = FieldKeys.Item.clean(doi: doi).addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { return } coordinatorDelegate?.show(doi: encoded) + + case .openCollection(let collection): + coordinatorDelegate?.show(collection: collection, libraryId: viewModel.state.library.identifier) + + case .openLibrary(let library): + coordinatorDelegate?.show(library: library.identifier) } } diff --git a/Zotero/Scenes/Main/Views/MainViewController.swift b/Zotero/Scenes/Main/Views/MainViewController.swift index 66a1e0359..7b0ae03f5 100644 --- a/Zotero/Scenes/Main/Views/MainViewController.swift +++ b/Zotero/Scenes/Main/Views/MainViewController.swift @@ -154,7 +154,13 @@ extension MainViewController: MainCoordinatorDelegate { var sharedTagFilterViewModel: ViewModel? { tagFilterViewModel } func showItems(for collection: Collection, in libraryId: LibraryIdentifier) { - guard isCollapsed || detailCoordinator?.libraryId != libraryId || detailCoordinator?.collection.identifier != collection.identifier else { return } + if !isCollapsed && detailCoordinator?.libraryId == libraryId && detailCoordinator?.collection.identifier == collection.identifier { + if (detailCoordinator?.navigationController?.viewControllers.count ?? 1) > 1 { + // Extraneous controllers are visible, pop to root to show items for given collection + detailCoordinator?.navigationController?.popToRootViewController(animated: true) + } + return + } showItems(for: collection, in: libraryId, searchItemKeys: nil) } } diff --git a/Zotero/Scenes/Master/Collections/Views/CollectionCellContentView.swift b/Zotero/Scenes/Master/Collections/Views/CollectionCellContentView.swift index edd8d5aa0..b095ae6bf 100644 --- a/Zotero/Scenes/Master/Collections/Views/CollectionCellContentView.swift +++ b/Zotero/Scenes/Master/Collections/Views/CollectionCellContentView.swift @@ -95,8 +95,10 @@ final class CollectionCellContentView: UIView { private func setup(with collection: Collection) { iconImage.image = UIImage(named: collection.iconName)?.withRenderingMode(.alwaysTemplate) + iconImage.alpha = collection.isAvailable ? 1 : 0.6 titleLabel.text = collection.name titleLabel.accessibilityLabel = collection.name + titleLabel.alpha = collection.isAvailable ? 1 : 0.6 } private var badgeBackgroundColor: UIColor { diff --git a/Zotero/Scenes/Master/Collections/Views/ExpandableCollectionsCollectionViewHandler.swift b/Zotero/Scenes/Master/Collections/Views/ExpandableCollectionsCollectionViewHandler.swift index 2a6c98755..a29327d71 100644 --- a/Zotero/Scenes/Master/Collections/Views/ExpandableCollectionsCollectionViewHandler.swift +++ b/Zotero/Scenes/Master/Collections/Views/ExpandableCollectionsCollectionViewHandler.swift @@ -158,10 +158,6 @@ extension ExpandableCollectionsCollectionViewHandler: UICollectionViewDelegate { } let collection = self.dataSource.snapshot().itemIdentifiers(inSection: indexPath.section)[indexPath.row] - - // We don't need to always show it on iPad, since the currently selected collection is visible. So we show only a new one. On iPhone - // on the other hand we see only the collection list, so we always need to open the item list for selected collection. - guard self.splitDelegate?.isSplit == false ? true : collection.identifier != self.viewModel.state.selectedCollectionId else { return } self.viewModel.process(action: .select(collection.identifier)) } diff --git a/Zotero/Scenes/Master/MasterCoordinator.swift b/Zotero/Scenes/Master/MasterCoordinator.swift index ecc28b2df..e3a515b15 100644 --- a/Zotero/Scenes/Master/MasterCoordinator.swift +++ b/Zotero/Scenes/Master/MasterCoordinator.swift @@ -217,18 +217,14 @@ extension MasterCoordinator: MasterLibrariesCoordinatorDelegate { } } else if let controller = navigationController.viewControllers[1] as? CollectionsViewController { // There is a Collections screen in the stack. - var modifiedViewControllers = false if count > 2 { // Remove any extraneous controllers. var viewControllers = navigationController.viewControllers viewControllers.removeLast(viewControllers.count - 2) navigationController.setViewControllers(viewControllers, animated: animated) - modifiedViewControllers = true - } - if controller.selectedCollectionId != collectionId || modifiedViewControllers { - // Select proper collection. - controller.viewModel.process(action: .select(collectionId)) } + // Select proper collection. + controller.viewModel.process(action: .select(collectionId)) } } From be39c99f7272569dcaf6bb9f9816115910fc2db7 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Wed, 14 Jan 2026 09:18:07 +0100 Subject: [PATCH 62/75] Updated html/epub reader --- reader | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reader b/reader index 1ed21a0c1..930176987 160000 --- a/reader +++ b/reader @@ -1 +1 @@ -Subproject commit 1ed21a0c102a686402f18e044a887a6d3e173dec +Subproject commit 930176987cabff62833f46118e0574220186455e From 67a582c5fac57412ac01f83dc19ace2aaa7efadd Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Wed, 14 Jan 2026 13:49:28 +0100 Subject: [PATCH 63/75] Fixed translation HTTP.request for document parsing Atom feeds as HTML documents (#1232) --- ZShare/Assets/translation/http.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ZShare/Assets/translation/http.js b/ZShare/Assets/translation/http.js index 7cc6ad4a1..0b76ae146 100644 --- a/ZShare/Assets/translation/http.js +++ b/ZShare/Assets/translation/http.js @@ -41,6 +41,13 @@ Zotero.HTTP = new function() { this.message = `HTTP request has timed out after ${ms}ms`; }; this.TimeoutError.prototype = Object.create(Error.prototype); + this.VALID_DOM_PARSER_CONTENT_TYPES = new Set([ + "text/html", + "text/xml", + "application/xml", + "application/xhtml+xml", + "image/svg+xml" + ]); /** * Get a promise for a HTTP request @@ -104,10 +111,7 @@ Zotero.HTTP = new function() { case "document": let parser = new DOMParser(); var contentType = headers["content-type"]; - if (contentType != 'application/xml' && contentType != 'text/xml') { - contentType = 'text/html'; - } - let doc = parser.parseFromString(responseText, contentType); + let doc = parser.parseFromString(responseText, this.determineDOMParserContentType(contentType)); response = doc; break; @@ -305,4 +309,20 @@ Zotero.HTTP = new function() { }; return deferred.promise; }; + + /** + * @param contentType {String} + * @returns {DOMParserSupportedType} + */ + this.determineDOMParserContentType = function(contentType) { + if (!contentType) { + return "text/html"; + } else if (Zotero.HTTP.VALID_DOM_PARSER_CONTENT_TYPES.has(contentType)) { + return contentType; + } else if (contentType.includes('xml')) { + return "text/xml"; + } else { + return "text/html"; + } + } } From bb4a84f080f72e77724d27e29b5eb19702655a34 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 15 Jan 2026 14:05:04 +0200 Subject: [PATCH 64/75] Update schema to version 40 --- bundled/schema.json | 410 ++++++++++++++++++++++++-------------------- 1 file changed, 222 insertions(+), 188 deletions(-) diff --git a/bundled/schema.json b/bundled/schema.json index 95be0a843..5f3662927 100644 --- a/bundled/schema.json +++ b/bundled/schema.json @@ -1,5 +1,5 @@ { - "version": 39, + "version": 40, "itemTypes": [ { "itemType": "annotation", @@ -735,15 +735,27 @@ { "field": "date" }, + { + "field": "eventPlace" + }, { "field": "volume" }, + { + "field": "issue" + }, + { + "field": "numberOfVolumes" + }, { "field": "pages" }, { "field": "series" }, + { + "field": "seriesNumber" + }, { "field": "DOI" }, @@ -2676,6 +2688,9 @@ { "field": "versionNumber" }, + { + "field": "edition" + }, { "field": "status" }, @@ -2688,6 +2703,15 @@ { "field": "place" }, + { + "field": "partNumber" + }, + { + "field": "partTitle" + }, + { + "field": "ISBN" + }, { "field": "DOI" }, @@ -2733,6 +2757,9 @@ "creatorType": "author", "primary": true }, + { + "creatorType": "editor" + }, { "creatorType": "contributor" } @@ -3342,7 +3369,7 @@ "edition" ], "event-place": [ - "place" + "eventPlace" ], "event-title": [ "meetingName", @@ -3387,6 +3414,12 @@ "number-of-volumes": [ "numberOfVolumes" ], + "original-publisher": [ + "originalPublisher" + ], + "original-publisher-place": [ + "originalPlace" + ], "part-number": [ "partNumber" ], @@ -3448,7 +3481,8 @@ "date": { "accessed": "accessDate", "issued": "date", - "submitted": "filingDate" + "submitted": "filingDate", + "original-date": "originalDate" } }, "names": { @@ -5040,7 +5074,7 @@ "edition": "Auflage", "encyclopediaTitle": "Titel der Enzyklopädie", "episodeNumber": "Nummer der Folge", - "eventPlace": "Event Place", + "eventPlace": "Veranstaltungsort", "extra": "Extra", "filingDate": "Datum der Einreichung", "firstPage": "Erste Seite", @@ -5074,8 +5108,8 @@ "numberOfVolumes": "Anzahl der Bände", "numPages": "Anzahl der Seiten", "organization": "Organisation", - "originalDate": "Original Date", - "originalPlace": "Original Place", + "originalDate": "Ursprüngliches Datum", + "originalPlace": "Ursprünglicher Ort", "originalPublisher": "Original Publisher", "pages": "Seiten", "partNumber": "Part Number", @@ -5134,7 +5168,7 @@ "bookAuthor": "Buchautor", "cartographer": "Kartograph", "castMember": "Ensemble", - "chair": "Chair", + "chair": "Vorsitzende*r", "commenter": "Kommentator", "composer": "Komponist", "contributor": "Mitarbeiter", @@ -6728,7 +6762,7 @@ "edition": "Painos", "encyclopediaTitle": "Tietosanakirjan otsake", "episodeNumber": "Jakson numero", - "eventPlace": "Event Place", + "eventPlace": "Tapahtumapaikka", "extra": "Ylim.", "filingDate": "Arkistointipäivä", "firstPage": "Ensimmäinen sivu", @@ -6762,19 +6796,19 @@ "numberOfVolumes": "Niteiden lkm.", "numPages": "Sivumäärä", "organization": "Organisaatio", - "originalDate": "Original Date", - "originalPlace": "Original Place", - "originalPublisher": "Original Publisher", + "originalDate": "Alkuperäinen päivämäärä", + "originalPlace": "Alkuperäinen paikkakunta", + "originalPublisher": "Alkuperäinen julkaisija", "pages": "Sivut", - "partNumber": "Part Number", - "partTitle": "Part Title", + "partNumber": "Osan numero", + "partTitle": "Osan nimi", "patentNumber": "Patenttinumero", "place": "Paikka", "PMCID": "PMCID", "PMID": "PMID", "postType": "Tyyppi", "presentationType": "Tyyppi", - "priorityDate": "Priority Date", + "priorityDate": "Etuoikeuspäivä", "priorityNumbers": "Etuoikeusnumerot", "proceedingsTitle": "Konferenssijulkaisun otsikko", "programmingLanguage": "Ohjelmointikieli", @@ -6798,7 +6832,7 @@ "seriesText": "Sarjan teksti", "seriesTitle": "Sarjan nimi", "session": "Istunto", - "sessionTitle": "Session Title", + "sessionTitle": "Session nimi", "shortTitle": "Lyhyt nimi", "status": "Tila", "studio": "Studio", @@ -6822,7 +6856,7 @@ "bookAuthor": "Kirjan tekijä", "cartographer": "Kartoittaja", "castMember": "Näyttelijä", - "chair": "Chair", + "chair": "Puheenjohtaja", "commenter": "Kommentoija", "composer": "Säveltäjä", "contributor": "Muu tekijä", @@ -6831,15 +6865,15 @@ "creator": "Tekijä", "director": "Ohjaaja", "editor": "Toimittaja", - "executiveProducer": "Executive Producer", + "executiveProducer": "Vastaava tuottaja", "guest": "Vieras", - "host": "Host", + "host": "Isäntä", "interviewee": "Haastattelussa", "interviewer": "Haastattelija", "inventor": "Keksijä", - "narrator": "Narrator", - "organizer": "Organizer", - "originalCreator": "Original Creator", + "narrator": "Kertoja", + "organizer": "Järjestäjä", + "originalCreator": "Alkuperäistekijä", "performer": "Esiintyjä", "podcaster": "Podcastin tekijä", "presenter": "Esittäjä", @@ -6848,7 +6882,7 @@ "recipient": "Vastaanottaja", "reviewedAuthor": "Arvostelun kohde", "scriptwriter": "Käsikirjoittaja", - "seriesCreator": "Series Creator", + "seriesCreator": "Sarjan luoja", "seriesEditor": "Sarjan toimittaja", "sponsor": "Sponsori", "translator": "Kääntäjä", @@ -7490,213 +7524,213 @@ }, "hr-HR": { "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Attachment", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Blog Post", - "book": "Book", - "bookSection": "Book Section", - "case": "Case", + "annotation": "Anotacija", + "artwork": "Umjetnički rad", + "attachment": "Prilog", + "audioRecording": "Zvučna snimka", + "bill": "Prijedlog zakona", + "blogPost": "Objava na blogu", + "book": "Knjiga", + "bookSection": "Dio knjige", + "case": "Slučaj", "computerProgram": "Software", - "conferencePaper": "Conference Paper", + "conferencePaper": "Konferencijski rad", "dataset": "Dataset", - "dictionaryEntry": "Dictionary Entry", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedia Article", + "dictionaryEntry": "Stavka u rječniku", + "document": "Dokument", + "email": "E-pošta", + "encyclopediaArticle": "Enciklopedijski članak", "film": "Film", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Interview", - "journalArticle": "Journal Article", - "letter": "Letter", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Map", - "newspaperArticle": "Newspaper Article", - "note": "Note", + "forumPost": "Objava na forumu", + "hearing": "Saslušanje", + "instantMessage": "Instantna poruka", + "interview": "Intervju", + "journalArticle": "Članak u časopisu", + "letter": "Pismo", + "magazineArticle": "Članak u magazinu", + "manuscript": "Rukopis", + "map": "Karta", + "newspaperArticle": "Članak u novinama", + "note": "Bilješka", "patent": "Patent", "podcast": "Podcast", "preprint": "Preprint", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Report", + "presentation": "Prezentacija", + "radioBroadcast": "Radijsko emitiranje", + "report": "Izvješće", "standard": "Standard", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Web Page" + "statute": "Statut", + "thesis": "Disertacija", + "tvBroadcast": "Televizijsko emitiranje", + "videoRecording": "Videosnimka", + "webpage": "Web-stranica" }, "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveID": "Archive ID", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "File Type", + "abstractNote": "Sažetak", + "accessDate": "Pristupljeno", + "applicationNumber": "Broj prijave", + "archive": "Arhiva", + "archiveID": "ID arhive", + "archiveLocation": "Lok. u arhivi", + "artworkMedium": "Medij", + "artworkSize": "Veličina umj. rada", + "assignee": "Nositelj prava", + "audioFileType": "Vrsta datoteke", "audioRecordingFormat": "Format", "authority": "Authority", - "billNumber": "Bill Number", - "blogTitle": "Blog Title", - "bookTitle": "Book Title", - "callNumber": "Call Number", - "caseName": "Case Name", + "billNumber": "Br. prijedloga zakona", + "blogTitle": "Naslov bloga", + "bookTitle": "Naslov knjige", + "callNumber": "Signatura", + "caseName": "Broj slučaja", "citationKey": "Citation Key", - "code": "Code", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "Company", - "conferenceName": "Conference Name", - "country": "Country", - "court": "Court", - "date": "Date", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Dictionary Title", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", + "code": "Zakonik", + "codeNumber": "Br. u zakoniku", + "codePages": "Str. zakonika", + "codeVolume": "Svezak zakonika", + "committee": "Vijeće", + "company": "Tvrtka", + "conferenceName": "Naziv konferencije", + "country": "Država", + "court": "Sud", + "date": "Datum", + "dateAdded": "Datum dodavanja", + "dateDecided": "Datum donošenja odluke", + "dateEnacted": "Datum donošenja", + "dateModified": "Promijenjeno", + "dictionaryTitle": "Naslov rječnika", + "distributor": "Distributer", + "docketNumber": "Broj predmeta", + "documentNumber": "Br. dokumenta", "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "Encyclopedia Title", - "episodeNumber": "Episode Number", + "edition": "Izdanje", + "encyclopediaTitle": "Naslov enciklopedije", + "episodeNumber": "Br. epizode", "eventPlace": "Event Place", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "First Page", + "extra": "Dodatno", + "filingDate": "Datum podnošenja", + "firstPage": "Prva stranica", "format": "Format", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "identifier": "Identifier", - "institution": "Institution", - "interviewMedium": "Medium", + "forumTitle": "Naslov foruma/Listserva", + "genre": "Žanr", + "history": "Povijest", + "identifier": "Identifikator", + "institution": "Institucija", + "interviewMedium": "Medij", "ISBN": "ISBN", "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Item Type", - "journalAbbreviation": "Journal Abbr", - "label": "Label", - "language": "Language", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Type", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Type", - "mapType": "Type", - "medium": "Medium", - "meetingName": "Meeting Name", - "nameOfAct": "Name of Act", - "network": "Network", - "number": "Number", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "organization": "Organization", + "issue": "Broj", + "issueDate": "Datum izdavanja", + "issuingAuthority": "Izdavačko tijelo", + "itemType": "Vrsta stavke", + "journalAbbreviation": "Skrać. naziv časop.", + "label": "Diskogr. kuća", + "language": "Jezik", + "legalStatus": "Pravni status", + "legislativeBody": "Zakonodavno tijelo", + "letterType": "Vrsta", + "libraryCatalog": "Katalog biblioteke", + "manuscriptType": "Vrsta", + "mapType": "Vrsta", + "medium": "Medij", + "meetingName": "Naziv sastanka", + "nameOfAct": "Naziv zakona", + "network": "Mreža", + "number": "Broj", + "numberOfVolumes": "# svezaka", + "numPages": "# stranica", + "organization": "Organizacija", "originalDate": "Original Date", "originalPlace": "Original Place", "originalPublisher": "Original Publisher", - "pages": "Pages", + "pages": "Stranice", "partNumber": "Part Number", "partTitle": "Part Title", - "patentNumber": "Patent Number", - "place": "Place", + "patentNumber": "Broj patenta", + "place": "Mjesto", "PMCID": "PMCID", "PMID": "PMID", - "postType": "Post Type", - "presentationType": "Type", + "postType": "Vrsta objave", + "presentationType": "Vrsta", "priorityDate": "Priority Date", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Publication", - "publicLawNumber": "Public Law Number", - "publisher": "Publisher", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Report Number", - "reportType": "Report Type", - "repository": "Repository", - "repositoryLocation": "Repo. Location", - "rights": "Rights", - "runningTime": "Running Time", - "scale": "Scale", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", + "priorityNumbers": "Br. prava prvenstva", + "proceedingsTitle": "Naslov zbornika radova", + "programmingLanguage": "Progr. jezik", + "programTitle": "Naslov programa", + "publicationTitle": "Publikacija", + "publicLawNumber": "Br. javn. zakona", + "publisher": "Izdavač", + "references": "Reference", + "reporter": "Zbirka sud. prakse", + "reporterVolume": "Svezak zbirke sudske prakse", + "reportNumber": "Broj izvješća", + "reportType": "Vrsta izvješća", + "repository": "Repozitorij", + "repositoryLocation": "Lokacija repozit.", + "rights": "Prava", + "runningTime": "Trajanje", + "scale": "Mjerilo", + "section": "Odjeljak", + "series": "Serija", + "seriesNumber": "Broj serije", + "seriesText": "Tekst serije", + "seriesTitle": "Naslov serije", + "session": "Sjednica", "sessionTitle": "Session Title", - "shortTitle": "Short Title", + "shortTitle": "Kratki naslov", "status": "Status", "studio": "Studio", - "subject": "Subject", - "system": "System", - "thesisType": "Type", - "title": "Title", - "type": "Type", - "university": "University", + "subject": "Predmet", + "system": "Sustav", + "thesisType": "Vrsta", + "title": "Naslov", + "type": "Vrsta", + "university": "Sveučilište", "url": "URL", - "versionNumber": "Version", + "versionNumber": "Verzija", "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Website Title", - "websiteType": "Website Type" + "volume": "Svezak", + "websiteTitle": "Naslov web-stranice", + "websiteType": "Vrsta web-stranice" }, "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Author", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", + "artist": "Umjetnik", + "attorneyAgent": "Odvjetnik/patentni zastupnik", + "author": "Autor", + "bookAuthor": "Autor knjige", + "cartographer": "Kartograf", + "castMember": "Član postave", "chair": "Chair", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", + "commenter": "Komentator", + "composer": "Skladatelj", + "contributor": "Doprinositelj", + "cosponsor": "Susponzor", + "counsel": "Pravni zastupnik", "creator": "Creator", - "director": "Director", - "editor": "Editor", + "director": "Redatelj", + "editor": "Urednik", "executiveProducer": "Executive Producer", - "guest": "Guest", + "guest": "Gost", "host": "Host", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", + "interviewee": "Intervju s", + "interviewer": "Intervjuer", + "inventor": "Izumitelj", "narrator": "Narrator", "organizer": "Organizer", "originalCreator": "Original Creator", - "performer": "Performer", + "performer": "Izvođač", "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", + "presenter": "Izlagač", + "producer": "Producent", + "programmer": "Programer", + "recipient": "Primatelj", + "reviewedAuthor": "Autor recenz. djela", + "scriptwriter": "Scenarist", "seriesCreator": "Series Creator", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "Translator", - "wordsBy": "Words By" + "seriesEditor": "Urednik serije", + "sponsor": "Sponzor", + "translator": "Prevoditelj", + "wordsBy": "Autor teksta" } }, "hu-HU": { From c98581f9c34b33c9f4dbef2a3dac008b0352ef41 Mon Sep 17 00:00:00 2001 From: Michal Rentka Date: Fri, 16 Jan 2026 16:27:02 +0100 Subject: [PATCH 65/75] Fix loading initial pdf page if not yet synced (#1233) --- .../Requests/ReadDocumentDataDbRequest.swift | 3 ++- .../Models/HtmlEpubReaderState.swift | 4 ++++ .../HtmlEpubReaderActionHandler.swift | 21 +++++++++++++++---- .../Detail/PDF/Models/PDFReaderState.swift | 15 +++++++++++-- .../ViewModels/PDFReaderActionHandler.swift | 6 ++++-- Zotero/Scenes/Detail/ReaderCoordinator.swift | 10 ++++++++- 6 files changed, 49 insertions(+), 10 deletions(-) diff --git a/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift index 2fa45e9ee..c21aa20d8 100644 --- a/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadDocumentDataDbRequest.swift @@ -15,11 +15,12 @@ struct ReadDocumentDataDbRequest: DbResponseRequest { let attachmentKey: String let libraryId: LibraryIdentifier + let defaultPageValue: String var needsWrite: Bool { return false } func process(in database: Realm) throws -> String { - guard let pageIndex = database.objects(RPageIndex.self).uniqueObject(key: attachmentKey, libraryId: libraryId) else { return "" } + guard let pageIndex = database.objects(RPageIndex.self).uniqueObject(key: attachmentKey, libraryId: libraryId) else { return defaultPageValue } return pageIndex.index } } diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift index 4d8fe4804..d695c6133 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift @@ -91,6 +91,10 @@ struct HtmlEpubReaderState: ViewModelState { return L10n.Errors.unknown } } + + var documentShouldClose: Bool { + return false + } } let readerURL: URL? diff --git a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift index 6e749cb3c..4c71a8378 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift @@ -788,9 +788,10 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro func loadItemAnnotationsAndPage(in viewModel: ViewModel) -> (RItem, Results, String)? { do { + let defaultPageValue = defaultPageValue(forExt: viewModel.state.documentFile.ext.lowercased()) let itemRequest = ReadItemDbRequest(libraryId: viewModel.state.library.identifier, key: viewModel.state.key) let item = try dbStorage.perform(request: itemRequest, on: .main) - let pageIndexRequest = ReadDocumentDataDbRequest(attachmentKey: viewModel.state.key, libraryId: viewModel.state.library.identifier) + let pageIndexRequest = ReadDocumentDataDbRequest(attachmentKey: viewModel.state.key, libraryId: viewModel.state.library.identifier, defaultPageValue: defaultPageValue) let pageIndex = try dbStorage.perform(request: pageIndexRequest, on: .main) let annotationsRequest = ReadAnnotationsDbRequest(attachmentKey: viewModel.state.key, libraryId: viewModel.state.library.identifier) let items = try dbStorage.perform(request: annotationsRequest, on: .main) @@ -799,6 +800,19 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro DDLogError("HtmlEpubReaderActionHandler: can't load annotations - \(error)") return nil } + + func defaultPageValue(forExt ext: String) -> String { + switch ext { + case "epub": + return "_start" + + case "html", "htm": + return "0" + + default: + return "" + } + } } func processAnnotations(items: Results) -> ([String], [String: HtmlEpubAnnotation], String) { @@ -818,11 +832,10 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro func loadTypeAndPage(from file: File, rawPage: String) throws -> (String, HtmlEpubReaderState.DocumentData.Page?) { switch viewModel.state.documentFile.ext.lowercased() { case "epub": - let cfi = rawPage.isEmpty ? "_start" : rawPage - return ("epub", .epub(cfi: cfi)) + return ("epub", .epub(cfi: rawPage)) case "html", "htm": - if let scrollYPercent = Double(rawPage.isEmpty ? "0" : rawPage) { + if let scrollYPercent = Double(rawPage) { return ("snapshot", .html(scrollYPercent: scrollYPercent)) } else { DDLogError("HtmlEPubReaderActionHandler: incompatible lastIndexPage stored for \(viewModel.state.key) - \(rawPage)") diff --git a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift index 34a3e38e6..695d0c7f8 100644 --- a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift +++ b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift @@ -62,10 +62,11 @@ struct PDFReaderState: ViewModelState { case pageNotInt case unknown case documentEmpty + case unknownLoading var title: String { switch self { - case .cantDeleteAnnotation, .cantAddAnnotations, .cantUpdateAnnotation, .pageNotInt, .unknown, .documentEmpty: + case .cantDeleteAnnotation, .cantAddAnnotations, .cantUpdateAnnotation, .pageNotInt, .unknown, .documentEmpty, .unknownLoading: return L10n.error case .mergeTooBig: @@ -90,13 +91,23 @@ struct PDFReaderState: ViewModelState { case .pageNotInt: return L10n.Errors.Pdf.pageIndexNotInt - case .unknown: + case .unknown, .unknownLoading: return L10n.Errors.unknown case .documentEmpty: return L10n.Errors.Pdf.emptyDocument } } + + var documentShouldClose: Bool { + switch self { + case .documentEmpty, .pageNotInt, .unknownLoading: + return true + + case .cantDeleteAnnotation, .cantAddAnnotations, .cantUpdateAnnotation, .mergeTooBig, .unknown: + return false + } + } } enum DefaultAnnotationPageLabel { diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index fdd2d4683..238b189d1 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -1875,8 +1875,10 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi observeDocument(in: viewModel) } catch let error { - // TODO: - Show error DDLogError("PDFReaderActionHandler: failed to load PDF: \(error)") + update(viewModel: viewModel) { state in + state.error = (error as? PDFReaderState.Error) ?? .unknownLoading + } } func observe(library: Library, viewModel: ViewModel, handler: PDFReaderActionHandler) { @@ -1935,7 +1937,7 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi try dbStorage.perform(on: .main, with: { coordinator in item = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) - pageStr = try coordinator.perform(request: ReadDocumentDataDbRequest(attachmentKey: key, libraryId: libraryId)) + pageStr = try coordinator.perform(request: ReadDocumentDataDbRequest(attachmentKey: key, libraryId: libraryId, defaultPageValue: "0")) results = try coordinator.perform(request: ReadAnnotationsDbRequest(attachmentKey: key, libraryId: libraryId)) }) diff --git a/Zotero/Scenes/Detail/ReaderCoordinator.swift b/Zotero/Scenes/Detail/ReaderCoordinator.swift index 0b8bdd680..1ff73341f 100644 --- a/Zotero/Scenes/Detail/ReaderCoordinator.swift +++ b/Zotero/Scenes/Detail/ReaderCoordinator.swift @@ -13,6 +13,8 @@ import RxSwift protocol ReaderError: Error { var title: String { get } var message: String { get } + + var documentShouldClose: Bool { get } } protocol ReaderState { @@ -100,7 +102,13 @@ protocol ReaderCoordinator: Coordinator, ReaderCoordinatorDelegate, ReaderSideba extension ReaderCoordinator { func show(error: ReaderError) { let controller = UIAlertController(title: error.title, message: error.message, preferredStyle: .alert) - controller.addAction(UIAlertAction(title: L10n.ok, style: .default)) + if error.documentShouldClose { + controller.addAction(UIAlertAction(title: L10n.close, style: .default, handler: { [weak self] _ in + self?.navigationController?.dismiss(animated: true) + })) + } else { + controller.addAction(UIAlertAction(title: L10n.ok, style: .default)) + } navigationController?.present(controller, animated: true) } From 0bf807345aa8f886ca891cef008a91bc03c2e044 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 20 Jan 2026 09:00:35 +0200 Subject: [PATCH 66/75] Update SPM dependencies --- Zotero.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 60377118d..c383201b7 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -7485,7 +7485,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 26.3.0; + version = 26.4.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 163f6bb70..0bc34c3b0 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "e7ed0f61825156153c493e3be530f75f70664b93", - "version" : "26.3.0" + "revision" : "7422bf221c71618ebd297806fc02ab27d9f1b4b7", + "version" : "26.4.0" } }, { From 2d297bb88bd755b2ba189796f1b5b81288146fc5 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 10 Feb 2026 16:44:40 +0200 Subject: [PATCH 67/75] Fix Sync Actions tests --- ZoteroTests/SyncActionsSpec.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ZoteroTests/SyncActionsSpec.swift b/ZoteroTests/SyncActionsSpec.swift index feee8b28a..a50f60f09 100644 --- a/ZoteroTests/SyncActionsSpec.swift +++ b/ZoteroTests/SyncActionsSpec.swift @@ -28,6 +28,7 @@ final class SyncActionsSpec: QuickSpec { let webDavController: WebDavController = WebDavTestController() var dbStorage: DbStorage! let disposeBag: DisposeBag = DisposeBag() + let myLibrary = Library(identifier: .custom(.myLibrary), name: L10n.Libraries.myLibrary, metadataEditable: true, filesEditable: true) beforeSuite { let config = Realm.Configuration(inMemoryIdentifier: "TestsRealmConfig") @@ -69,8 +70,10 @@ final class SyncActionsSpec: QuickSpec { try! FileManager.default.createMissingDirectories(for: collectionFile.createUrl().deletingLastPathComponent()) try! collectionData.write(to: collectionFile.createUrl()) let searchFile = Files.jsonCacheFile(for: .search, libraryId: .custom(.myLibrary), key: "CCCCCCCC") + try! FileManager.default.createMissingDirectories(for: searchFile.createUrl().deletingLastPathComponent()) try! searchData.write(to: searchFile.createUrl()) let itemFile = Files.jsonCacheFile(for: .item, libraryId: .custom(.myLibrary), key: "AAAAAAAA") + try! FileManager.default.createMissingDirectories(for: itemFile.createUrl().deletingLastPathComponent()) try! itemData.write(to: itemFile.createUrl()) // Create response models @@ -101,6 +104,8 @@ final class SyncActionsSpec: QuickSpec { creators: [:], fields: [:], abstract: "New abstract", + library: myLibrary, + collections: nil, dateModified: Date(), dateAdded: Date() ) @@ -111,6 +116,8 @@ final class SyncActionsSpec: QuickSpec { creators: [:], fields: [:], abstract: "Some note", + library: myLibrary, + collections: nil, dateModified: Date(), dateAdded: Date() ) @@ -213,6 +220,7 @@ final class SyncActionsSpec: QuickSpec { try? FileStorageController().remove(Files.jsonCacheFile(for: .item, libraryId: .custom(.myLibrary), key: "BBBBBBBB")) // Write original json files to directory folder for SyncActionHandler to use when reverting let itemFile = Files.jsonCacheFile(for: .item, libraryId: .custom(.myLibrary), key: "AAAAAAAA") + try! FileManager.default.createMissingDirectories(for: itemFile.createUrl().deletingLastPathComponent()) try! itemData.write(to: itemFile.createUrl()) // Create response models @@ -358,6 +366,8 @@ final class SyncActionsSpec: QuickSpec { creators: [:], fields: [:], abstract: "New abstract", + library: myLibrary, + collections: nil, dateModified: Date(), dateAdded: Date() ) @@ -368,6 +378,8 @@ final class SyncActionsSpec: QuickSpec { creators: [:], fields: [:], abstract: "Some note", + library: myLibrary, + collections: nil, dateModified: Date(), dateAdded: Date() ) From 8a61a2404ab78941ccf024a4c0097de638f96120 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 13 Feb 2026 14:12:12 +0200 Subject: [PATCH 68/75] Improve share extension handling for web dav errors (#1236) --- .../ShareViewController.swift | 8 +++- ZShare/ViewModels/ExtensionViewModel.swift | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/ZShare/View Controllers/ShareViewController.swift b/ZShare/View Controllers/ShareViewController.swift index 46537166b..fe24f9677 100644 --- a/ZShare/View Controllers/ShareViewController.swift +++ b/ZShare/View Controllers/ShareViewController.swift @@ -373,7 +373,7 @@ final class ShareViewController: UIViewController { private func updateNavigationItems(for state: ExtensionViewModel.State.AttachmentState, isSubmitting: Bool) { if let error = state.error { switch error { - case .quotaLimit, .webDavFailure, .apiFailure, .forbidden: + case .quotaLimit, .webDavFailure, .webDavUnauthorized, .webDavForbidden, .apiFailure, .forbidden: self.navigationItem.leftBarButtonItem = nil self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ShareViewController.cancel)) return @@ -475,6 +475,12 @@ final class ShareViewController: UIViewController { case .webDavNotVerified: return L10n.Errors.Shareext.webdavNotVerified + case .webDavUnauthorized: + return L10n.Errors.Settings.Webdav.unauthorized + + case .webDavForbidden: + return L10n.Errors.Settings.Webdav.forbidden + case .cantLoadSchema: return L10n.Errors.Shareext.cantLoadSchema diff --git a/ZShare/ViewModels/ExtensionViewModel.swift b/ZShare/ViewModels/ExtensionViewModel.swift index 31375fe2d..c0b2a517f 100644 --- a/ZShare/ViewModels/ExtensionViewModel.swift +++ b/ZShare/ViewModels/ExtensionViewModel.swift @@ -79,6 +79,8 @@ final class ExtensionViewModel { case quotaLimit(LibraryIdentifier) case forbidden(LibraryIdentifier) case webDavNotVerified + case webDavUnauthorized + case webDavForbidden case webDavFailure case md5Missing case mtimeMissing @@ -106,6 +108,8 @@ final class ExtensionViewModel { .webViewError, .quotaLimit, .webDavNotVerified, + .webDavUnauthorized, + .webDavForbidden, .webDavFailure: return false } @@ -1260,6 +1264,24 @@ final class ExtensionViewModel { if let error = error as? State.AttachmentState.Error { return error } + if let error = error as? WebDavError.Verification { + DDLogError("ExtensionViewModel: webdav verification failed - \(error)") + return .webDavNotVerified + } + if let error = error as? WebDavError.Upload { + DDLogError("ExtensionViewModel: webdav upload failed - \(error)") + switch error { + case .cantCreatePropData: + return .webDavFailure + + case .apiError(let alamoError, _): + return webDavError(from: alamoError) + } + } + if let error = error as? WebDavError.Download { + DDLogError("ExtensionViewModel: webdav download failed - \(error)") + return .webDavFailure + } if let error = error as? Parsing.Error { DDLogError("ExtensionViewModel: could not parse item - \(error)") return .parseError(error) @@ -1299,6 +1321,32 @@ final class ExtensionViewModel { } return .unknown + func webDavError(from error: AFError) -> State.AttachmentState.Error { + switch error { + case .responseValidationFailed(let reason): + switch reason { + case .unacceptableStatusCode(let code): + switch code { + case 401: + return .webDavUnauthorized + + case 403: + return .webDavForbidden + + default: + break + } + + default: + break + } + + default: + break + } + return .webDavFailure + } + func alamoErrorRequiresAbort(_ error: AFError, url: URL?, libraryId: LibraryIdentifier?) -> State.AttachmentState.Error { let defaultError: State.AttachmentState.Error = (url?.absoluteString ?? ApiConstants.baseUrlString).contains(ApiConstants.baseUrlString) ? .apiFailure : .webDavFailure switch error { From b1a1cdbe30d7df8c7657862fd8325d6b097bd07c Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 17 Feb 2026 15:59:33 +0200 Subject: [PATCH 69/75] Fix bugs (#1238) * Fix potential TagFilterActionHandler crash during logout * Fix RemoteAttachmentDownloader memory leak * Fix IdentifierLookupController memory leak * Normalize http arxiv URLs when in looking up via identifier * Remove unnecessary comment * Improve IdentifierLookupController URL normalization --- .../RemoteAttachmentDownloader.swift | 86 ++- .../IdentifierLookupController.swift | 502 +++++++++--------- .../ViewModels/TagFilterActionHandler.swift | 2 +- 3 files changed, 302 insertions(+), 288 deletions(-) diff --git a/Zotero/Controllers/Attachment Downloader/RemoteAttachmentDownloader.swift b/Zotero/Controllers/Attachment Downloader/RemoteAttachmentDownloader.swift index 0a984dabd..205733d1b 100644 --- a/Zotero/Controllers/Attachment Downloader/RemoteAttachmentDownloader.swift +++ b/Zotero/Controllers/Attachment Downloader/RemoteAttachmentDownloader.swift @@ -33,7 +33,6 @@ final class RemoteAttachmentDownloader { private let accessQueue: DispatchQueue private let processingQueue: DispatchQueue private let operationQueue: OperationQueue - private let disposeBag: DisposeBag private unowned let apiClient: ApiClient private unowned let fileStorage: FileStorage @@ -44,7 +43,7 @@ final class RemoteAttachmentDownloader { private var progressObservers: [Download: NSKeyValueObservation] private var batchProgress: Progress? private var totalBatchCount: Int = 0 - + var batchData: (Progress?, Int, Int) { var progress: Progress? var totalBatchCount = 0 @@ -76,7 +75,6 @@ final class RemoteAttachmentDownloader { self.operations = [:] self.progressObservers = [:] self.errors = [:] - self.disposeBag = DisposeBag() } func data(for key: String, parentKey: String, libraryId: LibraryIdentifier) -> (progress: CGFloat?, error: Swift.Error?) { @@ -113,7 +111,7 @@ final class RemoteAttachmentDownloader { } operationQueue.addOperations(operations, waitUntilFinished: false) } - + func createDownload(url: URL, attachment: Attachment, parentKey: String) -> (Download, RemoteAttachmentDownloadOperation)? { let download = Download(key: attachment.key, parentKey: parentKey, libraryId: attachment.libraryId) @@ -122,19 +120,19 @@ final class RemoteAttachmentDownloader { let progress = Progress(totalUnitCount: 100) let operation = RemoteAttachmentDownloadOperation(url: url, file: file, progress: progress, apiClient: apiClient, fileStorage: fileStorage, queue: processingQueue) operation.finishedDownload = { [weak self] result in - self?.accessQueue.async(flags: .barrier) { - finish(download: download, file: file, attachment: attachment, parentKey: parentKey, result: result) + self?.accessQueue.async(flags: .barrier) { [weak self] in + self?.finish(download: download, file: file, attachment: attachment, parentKey: parentKey, result: result) } } operation.progressHandler = { [weak self] progress in - self?.accessQueue.async(flags: .barrier) { - observe(progress: progress, attachment: attachment, download: download) + self?.accessQueue.async(flags: .barrier) { [weak self] in + self?.observe(progress: progress, attachment: attachment, download: download) } } operations[download] = operation totalBatchCount += 1 - + if let batchProgress { batchProgress.addChild(progress, withPendingUnitCount: 100) batchProgress.totalUnitCount += 100 @@ -145,45 +143,43 @@ final class RemoteAttachmentDownloader { } return (download, operation) - - @Sendable func finish(download: Download, file: File, attachment: Attachment, parentKey: String, result: Result<(), Swift.Error>) { - operations[download] = nil - progressObservers[download] = nil - resetBatchDataIfNeeded() - - switch result { - case .success: - DDLogInfo("RemoteAttachmentDownloader: finished downloading \(download.key)") - observable.on(.next(Update(download: download, kind: .ready(attachment)))) - errors[download] = nil - - case .failure(let error): - DDLogError("RemoteAttachmentDownloader: failed to download attachment \(download.key), \(download.libraryId) - \(error)") - - let isCancelError = (error as? RemoteAttachmentDownloadOperation.Error) == .cancelled - errors[download] = isCancelError ? nil : error - - if isCancelError { - observable.on(.next(Update(download: download, kind: .cancelled))) - } else { - observable.on(.next(Update(download: download, kind: .failed))) - } - } - } - - @Sendable func observe(progress: Progress, attachment: Attachment, download: Download) { - let observer = progress.observe(\.fractionCompleted) { [weak self] progress, _ in - self?.observable.on(.next(Update(download: download, kind: .progress(CGFloat(progress.fractionCompleted))))) - } - progressObservers[download] = observer + } + } + + private func finish(download: Download, file: File, attachment: Attachment, parentKey: String, result: Result<(), Swift.Error>) { + operations[download] = nil + progressObservers[download] = nil + if operations.isEmpty { + // Reset batch data. + totalBatchCount = 0 + batchProgress = nil + } + + switch result { + case .success: + DDLogInfo("RemoteAttachmentDownloader: finished downloading \(download.key)") + observable.on(.next(Update(download: download, kind: .ready(attachment)))) + errors[download] = nil + + case .failure(let error): + DDLogError("RemoteAttachmentDownloader: failed to download attachment \(download.key), \(download.libraryId) - \(error)") + + let isCancelError = (error as? RemoteAttachmentDownloadOperation.Error) == .cancelled + errors[download] = isCancelError ? nil : error + + if isCancelError { + observable.on(.next(Update(download: download, kind: .cancelled))) + } else { + observable.on(.next(Update(download: download, kind: .failed))) } } } - - private func resetBatchDataIfNeeded() { - guard operations.isEmpty else { return } - totalBatchCount = 0 - batchProgress = nil + + private func observe(progress: Progress, attachment: Attachment, download: Download) { + let observer = progress.observe(\.fractionCompleted) { [weak self] progress, _ in + self?.observable.on(.next(Update(download: download, kind: .progress(CGFloat(progress.fractionCompleted))))) + } + progressObservers[download] = observer } func stop() { diff --git a/Zotero/Controllers/IdentifierLookupController.swift b/Zotero/Controllers/IdentifierLookupController.swift index 3879e8357..d4a9d00ea 100644 --- a/Zotero/Controllers/IdentifierLookupController.swift +++ b/Zotero/Controllers/IdentifierLookupController.swift @@ -115,11 +115,11 @@ final class IdentifierLookupController { private unowned let remoteFileDownloader: RemoteAttachmentDownloader private let disposeBag: DisposeBag - private var lookupData: OrderedDictionary = [:] + private var lookupDataByIdentifier: OrderedDictionary = [:] private var lookupSavedCount = 0 private var lookupFailedCount = 0 private var lookupTotalCount: Int { - lookupData.count + lookupDataByIdentifier.count } private var lookupRemainingCount: Int { lookupTotalCount - lookupSavedCount - lookupFailedCount @@ -167,14 +167,14 @@ final class IdentifierLookupController { self.dateParser = dateParser self.remoteFileDownloader = remoteFileDownloader - self.dispatchSpecificKey = DispatchSpecificKey() - self.accessQueueLabel = "org.zotero.IdentifierLookupController.accessQueue" - self.accessQueue = DispatchQueue(label: accessQueueLabel, qos: .userInteractive, attributes: .concurrent) + dispatchSpecificKey = DispatchSpecificKey() + accessQueueLabel = "org.zotero.IdentifierLookupController.accessQueue" + accessQueue = DispatchQueue(label: accessQueueLabel, qos: .userInteractive, attributes: .concurrent) accessQueue.setSpecific(key: dispatchSpecificKey, value: accessQueueLabel) - self.backgroundQueue = DispatchQueue(label: "org.zotero.IdentifierLookupController.backgroundProcessing", qos: .userInitiated) - self.backgroundScheduler = SerialDispatchQueueScheduler(queue: backgroundQueue, internalSerialQueueName: "org.zotero.IdentifierLookupController.backgroundScheduler") - self.observable = PublishSubject() - self.disposeBag = DisposeBag() + backgroundQueue = DispatchQueue(label: "org.zotero.IdentifierLookupController.backgroundProcessing", qos: .userInitiated) + backgroundScheduler = SerialDispatchQueueScheduler(queue: backgroundQueue, internalSerialQueueName: "org.zotero.IdentifierLookupController.backgroundScheduler") + observable = PublishSubject() + disposeBag = DisposeBag() setupObservers() } @@ -189,14 +189,13 @@ final class IdentifierLookupController { guard let self else { return } let lookupSettings = LookupSettings(libraryIdentifier: libraryId, collectionKeys: collectionKeys) if lookupWebViewHandlersByLookupSettings[lookupSettings] != nil { - lookupData = Array(self.lookupData.values) + lookupData = Array(lookupDataByIdentifier.values) return } var lookupWebViewHandler: LookupWebViewHandler? - inMainThread(sync: true) { - if let webView = self.webViewProvider?.addWebView(configuration: nil) { - lookupWebViewHandler = LookupWebViewHandler(webView: webView, translatorsController: self.translatorsController, types: .all) - } + inMainThread(sync: true) { [weak self] in + guard let self, let webView = webViewProvider?.addWebView(configuration: nil) else { return } + lookupWebViewHandler = LookupWebViewHandler(webView: webView, translatorsController: translatorsController, types: .all) } guard let lookupWebViewHandler else { DDLogError("IdentifierLookupController: can't create LookupWebViewHandler instance") @@ -204,7 +203,7 @@ final class IdentifierLookupController { } lookupWebViewHandlersByLookupSettings[lookupSettings] = lookupWebViewHandler setupObserver(for: lookupWebViewHandler, libraryId: libraryId, collectionKeys: collectionKeys) - lookupData = Array(self.lookupData.values) + lookupData = Array(lookupDataByIdentifier.values) } } @@ -226,11 +225,10 @@ final class IdentifierLookupController { lookupWebViewHandlersByLookupSettings.removeValue(forKey: key)?.removeFromSuperviewAsynchronously() } remoteFileDownloader.stop() - let lookupData = self.lookupData cleanupLookupIfNeeded(force: true) { [weak self] _ in self?.observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } - let storedItemResponses: [(ItemResponse, LibraryIdentifier)] = lookupData.values.compactMap { + let storedItemResponses: [(ItemResponse, LibraryIdentifier)] = lookupDataByIdentifier.values.compactMap { switch $0.state { case .translated(let translatedLookupData): return (translatedLookupData.response, translatedLookupData.libraryId) @@ -255,298 +253,318 @@ final class IdentifierLookupController { private func setupObservers() { remoteFileDownloader.observable .observe(on: backgroundScheduler) - .subscribe { [weak self] update in - var cleanupLookupIfNeeded = false + .subscribe { [weak self] (update: RemoteAttachmentDownloader.Update) in + guard let self else { return } + var cleanupLookup = false switch update.kind { case .ready(let attachment): - finish(download: update.download, attachment: attachment) - cleanupLookupIfNeeded = true + let localizedType = schemaController.localized(itemType: ItemTypes.attachment) ?? ItemTypes.attachment + do { + let request = CreateAttachmentDbRequest( + attachment: attachment, + parentKey: update.download.parentKey, + localizedType: localizedType, + includeAccessDate: attachment.hasUrl, + collections: [], + tags: [] + ) + _ = try dbStorage.perform(request: request, on: backgroundQueue) + } catch let error { + DDLogError("IdentifierLookupController: can't store attachment after download - \(error)") + + // Storing item failed, remove downloaded file + guard let file = attachment.file else { return } + try? fileStorage.remove(file) + } + + cleanupLookup = true case .cancelled, .failed: - cleanupLookupIfNeeded = true + cleanupLookup = true case .progress: break } - guard cleanupLookupIfNeeded else { return } - self?.cleanupLookupIfNeeded(force: false) { [weak self] _ in + guard cleanupLookup else { return } + cleanupLookupIfNeeded(force: false) { [weak self] _ in guard let self else { return } observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } } - .disposed(by: self.disposeBag) - - func finish(download: RemoteAttachmentDownloader.Download, attachment: Attachment) { - let localizedType = schemaController.localized(itemType: ItemTypes.attachment) ?? ItemTypes.attachment - do { - let request = CreateAttachmentDbRequest( - attachment: attachment, - parentKey: download.parentKey, - localizedType: localizedType, - includeAccessDate: attachment.hasUrl, - collections: [], - tags: [] - ) - _ = try self.dbStorage.perform(request: request, on: self.backgroundQueue) - } catch let error { - DDLogError("IdentifierLookupController: can't store attachment after download - \(error)") - - // Storing item failed, remove downloaded file - guard let file = attachment.file else { return } - try? self.fileStorage.remove(file) - } - } + .disposed(by: disposeBag) } private func setupObserver(for lookupWebViewHandler: LookupWebViewHandler, libraryId: LibraryIdentifier, collectionKeys: Set) { lookupWebViewHandler.observable - .subscribe { result in - process(result: result) + .subscribe { [weak self] result in + self?.process(result: result, libraryId: libraryId, collectionKeys: collectionKeys) } - .disposed(by: self.disposeBag) - - func process(result: Result) { - switch result { - case .success(let data): - process(data: data) - - case .failure(let error): - DDLogError("IdentifierLookupController: lookup failed - \(error)") - cleanupLookupIfNeeded(force: false) { [weak self] _ in - guard let self else { return } - observable.on(.next(Update(kind: .lookupError(error: error), lookupData: Array(lookupData.values)))) - } + .disposed(by: disposeBag) + } + + private func process(result: Result, libraryId: LibraryIdentifier, collectionKeys: Set) { + switch result { + case .success(let data): + process(data: data) + + case .failure(let error): + DDLogError("IdentifierLookupController: lookup failed - \(error)") + cleanupLookupIfNeeded(force: false) { [weak self] _ in + guard let self else { return } + observable.on(.next(Update(kind: .lookupError(error: error), lookupData: Array(lookupDataByIdentifier.values)))) } - - func process(data: LookupWebViewHandler.LookupData) { - switch data { - case .identifiers(let identifiers): - let enqueuedIdentifiers = identifiers.map({ identifier(from: $0) }) - enqueueLookup(for: enqueuedIdentifiers) { [weak self] validIdentifiers in - guard let self else { return } - if validIdentifiers.isEmpty { - cleanupLookupIfNeeded(force: false) { [weak self] _ in - guard let self else { return } - observable.on(.next(Update(kind: .identifiersDetected(identifiers: []), lookupData: Array(lookupData.values)))) - } + } + + func process(data: LookupWebViewHandler.LookupData) { + switch data { + case .identifiers(let identifiers): + let enqueuedIdentifiers = identifiers.map({ identifier(from: $0) }) + enqueueLookup(for: enqueuedIdentifiers) { [weak self] validIdentifiers in + guard let self else { return } + if validIdentifiers.isEmpty { + cleanupLookupIfNeeded(force: false) { [weak self] _ in + guard let self else { return } + observable.on(.next(Update(kind: .identifiersDetected(identifiers: []), lookupData: Array(lookupDataByIdentifier.values)))) } - observable.on(.next(Update(kind: .identifiersDetected(identifiers: validIdentifiers), lookupData: Array(lookupData.values)))) - } - - case .item(let data): - guard let lookupId = data["identifier"] as? [String: String] else { - DDLogWarn("IdentifierLookupController: lookup item data don't contain identifier") - return - } - let identifier = identifier(from: lookupId) - var currentState: LookupData.State? - accessQueue.sync { [weak self] in - guard let self, let currentLookupData = lookupData[identifier] else { return } - currentState = currentLookupData.state } - guard currentState?.canTransition == true else { - DDLogWarn("IdentifierLookupController: \(identifier) lookup item can't transition from state: \(String(describing: currentState))") - return + observable.on(.next(Update(kind: .identifiersDetected(identifiers: validIdentifiers), lookupData: Array(lookupDataByIdentifier.values)))) + } + + case .item(let data): + guard let lookupId = data["identifier"] as? [String: String] else { + DDLogWarn("IdentifierLookupController: lookup item data don't contain identifier") + return + } + let identifier = identifier(from: lookupId) + var currentState: LookupData.State? + accessQueue.sync { [weak self] in + guard let self, let currentLookupData = lookupDataByIdentifier[identifier] else { return } + currentState = currentLookupData.state + } + guard currentState?.canTransition == true else { + DDLogWarn("IdentifierLookupController: \(identifier) lookup item can't transition from state: \(String(describing: currentState))") + return + } + + if data.keys.count == 1 { + changeLookup(for: identifier, to: .inProgress) { [weak self] didChange in + guard let self, didChange else { return } + observable.on(.next(Update(kind: .lookupInProgress(identifier: identifier), lookupData: Array(lookupDataByIdentifier.values)))) + // Since at least one identifier lookup is in progress, there is no need to cleanup if needed. } + return + } - if data.keys.count == 1 { - changeLookup(for: identifier, to: .inProgress) { [weak self] didChange in - guard let self, didChange else { return } - observable.on(.next(Update(kind: .lookupInProgress(identifier: identifier), lookupData: Array(lookupData.values)))) - // Since at least one identifier lookup is in progress, there is no need to cleanup if needed. + if let error = data["error"] { + DDLogError("IdentifierLookupController: \(identifier) lookup failed - \(error)") + changeLookup(for: identifier, to: .failed) { [weak self] didChange in + guard let self, didChange else { return } + observable.on(.next(Update(kind: .lookupFailed(identifier: identifier), lookupData: Array(lookupDataByIdentifier.values)))) + cleanupLookupIfNeeded(force: false) { [weak self] cleaned in + guard let self, cleaned else { return } + observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } - return } + return + } - if let error = data["error"] { - DDLogError("IdentifierLookupController: \(identifier) lookup failed - \(error)") - changeLookup(for: identifier, to: .failed) { [weak self] didChange in - guard let self, didChange else { return } - observable.on(.next(Update(kind: .lookupFailed(identifier: identifier), lookupData: Array(lookupData.values)))) - cleanupLookupIfNeeded(force: false) { [weak self] cleaned in - guard let self, cleaned else { return } - observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) - } + guard let itemData = data["data"] as? [[String: Any]], + let item = itemData.first, + let (response, attachments) = parse(item, libraryId: libraryId, collectionKeys: collectionKeys, schemaController: schemaController, dateParser: dateParser) + else { + changeLookup(for: identifier, to: .failed) { [weak self] didChange in + guard let self, didChange else { return } + observable.on(.next(Update(kind: .parseFailed(identifier: identifier), lookupData: Array(lookupDataByIdentifier.values)))) + cleanupLookupIfNeeded(force: false) { [weak self] cleaned in + guard let self, cleaned else { return } + observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } - return } + return + } + + process(identifier: identifier, response: response, attachments: attachments, libraryId: libraryId, collectionKeys: collectionKeys) + } + + func identifier(from data: [String: String]) -> String { + var result = "" + for (key, value) in data { + result += key + ":" + value + } + return result + } + + /// Tries to parse `ItemResponse` from data returned by translation server. It prioritizes items with attachments if there are multiple items. + /// - parameter itemData: Data to parse + /// - parameter schemaController: SchemaController which is used for validating item type and field types + /// - returns: `ItemResponse` of parsed item and optional attachment dictionary with title and url. + func parse( + _ itemData: [String: Any], + libraryId: LibraryIdentifier, + collectionKeys: Set, + schemaController: SchemaController, + dateParser: DateParser + ) -> (ItemResponse, [(Attachment, URL)])? { + do { + let item = try ItemResponse(translatorResponse: itemData, schemaController: schemaController).copy(libraryId: libraryId, collectionKeys: collectionKeys, tags: []) - guard let itemData = data["data"] as? [[String: Any]], - let item = itemData.first, - let (response, attachments) = parse(item, libraryId: libraryId, collectionKeys: collectionKeys, schemaController: schemaController, dateParser: dateParser) - else { + let attachments = ((itemData["attachments"] as? [[String: Any]]) ?? []).compactMap { data -> (Attachment, URL)? in + // We can't process snapshots yet, so ignore all text/html attachments + guard let mimeType = data["mimeType"] as? String, + mimeType != "text/html", + let ext = mimeType.extensionFromMimeType, + let urlString = data["url"] as? String, + let url = URL(string: urlString) + else { return nil } + + let key = KeyGenerator.newKey + let filename = FilenameFormatter.filename(from: item, defaultTitle: "Full Text", ext: ext, dateParser: dateParser) + let attachment = Attachment( + type: .file(filename: filename, contentType: mimeType, location: .local, linkType: .importedFile, compressed: false), + title: filename, + key: key, + libraryId: libraryId + ) + + return (attachment, normalizeURL(url)) + } + + return (item, attachments) + } catch let error { + DDLogError("IdentifierLookupController: can't parse data - \(error)") + return nil + } + + func normalizeURL(_ url: URL) -> URL { + guard url.scheme?.lowercased() == "http", + let host = url.host?.lowercased(), + host == "arxiv.org" || host.hasSuffix(".arxiv.org") + || host == "xxx.lanl.gov" || host.hasSuffix(".xxx.lanl.gov"), + var components = URLComponents(url: url, resolvingAgainstBaseURL: true) + else { return url } + components.scheme = "https" + guard let normalizedURL = components.url else { return url } + DDLogWarn("IdentifierLookupController: normalized URL \(url) to \(normalizedURL)") + return normalizedURL + } + } + + func process(identifier: String, response: ItemResponse, attachments: [(Attachment, URL)], libraryId: LibraryIdentifier, collectionKeys: Set) { + backgroundQueue.async { [weak self] in + guard let self else { return } + do { + try storeDataAndDownloadAttachmentIfNecessary(identifier: identifier, response: response, attachments: attachments) + } catch let error { + DDLogError("IdentifierLookupController: can't create item(s) - \(error)") changeLookup(for: identifier, to: .failed) { [weak self] didChange in guard let self, didChange else { return } - observable.on(.next(Update(kind: .parseFailed(identifier: identifier), lookupData: Array(lookupData.values)))) + observable.on(.next(Update( + kind: .itemCreationFailed(identifier: identifier, response: response, attachments: attachments), + lookupData: Array(lookupDataByIdentifier.values)) + )) cleanupLookupIfNeeded(force: false) { [weak self] cleaned in guard let self, cleaned else { return } observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } } - return } - - process(identifier: identifier, response: response, attachments: attachments, libraryId: libraryId, collectionKeys: collectionKeys) } - - func identifier(from data: [String: String]) -> String { - var result = "" - for (key, value) in data { - result += key + ":" + value + + func storeDataAndDownloadAttachmentIfNecessary(identifier: String, response: ItemResponse, attachments: [(Attachment, URL)]) throws { + var library: Library? + try dbStorage.perform(on: backgroundQueue) { coordinator in + _ = try coordinator.perform(request: CreateTranslatedItemsDbRequest(responses: [response], schemaController: schemaController, dateParser: dateParser)) + library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) } - return result - } + changeLookup( + for: identifier, + to: .translated(.init(response: response, attachments: attachments, libraryId: libraryId, collectionKeys: collectionKeys)) + ) { [weak self] didChange in + guard let self, didChange else { return } + observable.on(.next(Update(kind: .itemStored(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupDataByIdentifier.values)))) - /// Tries to parse `ItemResponse` from data returned by translation server. It prioritizes items with attachments if there are multiple items. - /// - parameter itemData: Data to parse - /// - parameter schemaController: SchemaController which is used for validating item type and field types - /// - returns: `ItemResponse` of parsed item and optional attachment dictionary with title and url. - func parse( - _ itemData: [String: Any], - libraryId: LibraryIdentifier, - collectionKeys: Set, - schemaController: SchemaController, - dateParser: DateParser - ) -> (ItemResponse, [(Attachment, URL)])? { - do { - let item = try ItemResponse(translatorResponse: itemData, schemaController: schemaController).copy(libraryId: libraryId, collectionKeys: collectionKeys, tags: []) - - let attachments = ((itemData["attachments"] as? [[String: Any]]) ?? []).compactMap { data -> (Attachment, URL)? in - // We can't process snapshots yet, so ignore all text/html attachments - guard let mimeType = data["mimeType"] as? String, mimeType != "text/html", let ext = mimeType.extensionFromMimeType, - let urlString = data["url"] as? String, let url = URL(string: urlString) - else { return nil } - - let key = KeyGenerator.newKey - let filename = FilenameFormatter.filename(from: item, defaultTitle: "Full Text", ext: ext, dateParser: dateParser) - let attachment = Attachment( - type: .file(filename: filename, contentType: mimeType, location: .local, linkType: .importedFile, compressed: false), - title: filename, - key: key, - libraryId: libraryId - ) - - return (attachment, url) + if Defaults.shared.shareExtensionIncludeAttachment, library?.filesEditable == true, !attachments.isEmpty { + let downloadData = attachments.map({ ($0, $1, response.key) }) + remoteFileDownloader.download(data: downloadData) + observable.on(.next(Update( + kind: .pendingAttachments(identifier: identifier, response: response, attachments: attachments), + lookupData: Array(lookupDataByIdentifier.values)) + )) } - return (item, attachments) - } catch let error { - DDLogError("IdentifierLookupController: can't parse data - \(error)") - return nil - } - } - - func process(identifier: String, response: ItemResponse, attachments: [(Attachment, URL)], libraryId: LibraryIdentifier, collectionKeys: Set) { - backgroundQueue.async { [weak self] in - guard let self else { return } - do { - try storeDataAndDownloadAttachmentIfNecessary(identifier: identifier, response: response, attachments: attachments) - } catch let error { - DDLogError("IdentifierLookupController: can't create item(s) - \(error)") - changeLookup(for: identifier, to: .failed) { [weak self] didChange in - guard let self, didChange else { return } - observable.on(.next(Update(kind: .itemCreationFailed(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupData.values)))) - cleanupLookupIfNeeded(force: false) { [weak self] cleaned in - guard let self, cleaned else { return } - observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) - } - } - } - } - - func storeDataAndDownloadAttachmentIfNecessary(identifier: String, response: ItemResponse, attachments: [(Attachment, URL)]) throws { - var library: Library? - try dbStorage.perform(on: backgroundQueue) { coordinator in - _ = try coordinator.perform(request: CreateTranslatedItemsDbRequest(responses: [response], schemaController: schemaController, dateParser: dateParser)) - library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) - } - changeLookup( - for: identifier, - to: .translated(.init(response: response, attachments: attachments, libraryId: libraryId, collectionKeys: collectionKeys)) - ) { [weak self] didChange in - guard let self, didChange else { return } - observable.on(.next(Update(kind: .itemStored(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupData.values)))) - - if Defaults.shared.shareExtensionIncludeAttachment, library?.filesEditable == true, !attachments.isEmpty { - let downloadData = attachments.map({ ($0, $1, response.key) }) - remoteFileDownloader.download(data: downloadData) - observable.on(.next(Update(kind: .pendingAttachments(identifier: identifier, response: response, attachments: attachments), lookupData: Array(lookupData.values)))) - } - - cleanupLookupIfNeeded(force: false) { [weak self] cleaned in - guard let self, cleaned else { return } - observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) - } + cleanupLookupIfNeeded(force: false) { [weak self] cleaned in + guard let self, cleaned else { return } + observable.on(.next(Update(kind: .finishedAllLookups, lookupData: []))) } } } } } } - + // MARK: Lookup Data private func cleanupLookupIfNeeded(force: Bool, completion: @escaping (Bool) -> Void) { if DispatchQueue.getSpecific(key: dispatchSpecificKey) == accessQueueLabel { cleanupLookup(force: force, completion: completion) } else { - accessQueue.async(flags: .barrier) { - cleanupLookup(force: force, completion: completion) + accessQueue.async(flags: .barrier) { [weak self] in + self?.cleanupLookup(force: force, completion: completion) } } + } - func cleanupLookup(force: Bool, completion: @escaping (Bool) -> Void) { - if force { - // If forced, cleanup and return - cleanup(completion: completion) - return - } - guard lookupRemainingCount == 0, remoteFileDownloader.batchData.2 == 0 else { - // If there are remaining lookups, or downloading attachments, then just return + private func cleanupLookup(force: Bool, completion: @escaping (Bool) -> Void) { + if force { + // If forced, cleanup and return + cleanup(completion: completion) + return + } + guard lookupRemainingCount == 0, remoteFileDownloader.batchData.2 == 0 else { + // If there are remaining lookups, or downloading attachments, then just return + completion(false) + return + } + guard let presenter else { + // If no presenter is assigned, then cleanup and return + cleanup(completion: completion) + return + } + // Presenter is assigned + DispatchQueue.main.async { [weak self] in + // Checking if it is presenting in main queue. + // Doing so asynchronously, to not cause a deadlock if cleanupLookupIfNeeded is already called from the main thread. + guard !presenter.isPresenting(), let self else { completion(false) return } - guard let presenter else { - // If no presenter is assigned, then cleanup and return - cleanup(completion: completion) - return - } - // Presenter is assigned - DispatchQueue.main.async { [weak self] in - // Checking if it is presenting in main queue. - // Doing so asynchronously, to not cause a deadlock if cleanupLookupIfNeeded is already called from the main thread. - guard !presenter.isPresenting(), let self else { - completion(false) - return - } - // It is not presenting, then cleanup - self.accessQueue.async(flags: .barrier) { - cleanup(completion: completion) - } + // It is not presenting, then cleanup + accessQueue.async(flags: .barrier) { [weak self] in + self?.cleanup(completion: completion) } + } + } - @Sendable func cleanup(completion: @escaping (Bool) -> Void) { - lookupData = [:] - lookupSavedCount = 0 - lookupFailedCount = 0 - DDLogInfo("IdentifierLookupController: cleaned up lookup data") - let keys = lookupWebViewHandlersByLookupSettings.keys - for key in keys { - lookupWebViewHandlersByLookupSettings.removeValue(forKey: key)?.removeFromSuperviewAsynchronously() - } - completion(true) - } + private func cleanup(completion: @escaping (Bool) -> Void) { + lookupDataByIdentifier = [:] + lookupSavedCount = 0 + lookupFailedCount = 0 + DDLogInfo("IdentifierLookupController: cleaned up lookup data") + let keys = lookupWebViewHandlersByLookupSettings.keys + for key in keys { + lookupWebViewHandlersByLookupSettings.removeValue(forKey: key)?.removeFromSuperviewAsynchronously() } + completion(true) } - + private func enqueueLookup(for identifiers: [String], completion: @escaping ([String]) -> Void) { accessQueue.async(flags: .barrier) { [weak self] in guard let self else { return } var newUniqueIdentifiers: [String] = [] var index = 0 for identifier in identifiers { - guard lookupData[identifier] == nil else { continue } + guard lookupDataByIdentifier[identifier] == nil else { continue } newUniqueIdentifiers.append(identifier) - lookupData.updateValue(.init(identifier: identifier, state: .enqueued), forKey: identifier, insertingAt: index) + lookupDataByIdentifier.updateValue(.init(identifier: identifier, state: .enqueued), forKey: identifier, insertingAt: index) index += 1 } completion(newUniqueIdentifiers) @@ -560,14 +578,14 @@ final class IdentifierLookupController { defer { completion(didChange) } - guard let currentLookupData = lookupData[identifier] else { return } + guard let currentLookupData = lookupDataByIdentifier[identifier] else { return } let currentState = currentLookupData.state let isTransitionValid = LookupData.State.isTransitionValid(from: currentState, to: state) guard isTransitionValid else { DDLogWarn("IdentifierLookupController: \(identifier) lookup item won't transition from state: \(String(describing: currentState)) to state: \(String(describing: state))") return } - lookupData[identifier] = .init(identifier: identifier, state: state) + lookupDataByIdentifier[identifier] = .init(identifier: identifier, state: state) didChange = true switch state { case .failed: diff --git a/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift b/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift index 7a3786011..b01cdced3 100644 --- a/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift +++ b/Zotero/Scenes/Master/TagFiltering/ViewModels/TagFilterActionHandler.swift @@ -16,7 +16,7 @@ struct TagFilterActionHandler: ViewModelActionHandler, BackgroundDbProcessingAct typealias State = TagFilterState let backgroundQueue: DispatchQueue - unowned let dbStorage: DbStorage + let dbStorage: DbStorage init(dbStorage: DbStorage) { self.dbStorage = dbStorage From 371286e1411ada42c33deddef37beeba5ad4cbb1 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 17 Feb 2026 15:59:52 +0200 Subject: [PATCH 70/75] Update SPM dependencies (#1239) --- Zotero.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/swiftpm/Package.resolved | 12 ++++++------ .../PDF/ViewModels/PDFReaderActionHandler.swift | 4 +++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index c383201b7..6c5f3d42b 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -7397,7 +7397,7 @@ repositoryURL = "https://github.com/Alamofire/Alamofire"; requirement = { kind = exactVersion; - version = 5.11.0; + version = 5.11.1; }; }; B356A367252490DB003F1943 /* XCRemoteSwiftPackageReference "keychain-swift" */ = { @@ -7477,7 +7477,7 @@ repositoryURL = "https://github.com/ReactiveX/RxSwift"; requirement = { kind = exactVersion; - version = 6.9.1; + version = 6.10.1; }; }; B3A6C59D252CA08200F24CBE /* XCRemoteSwiftPackageReference "PSPDFKit-SP" */ = { @@ -7485,7 +7485,7 @@ repositoryURL = "https://github.com/PSPDFKit/PSPDFKit-SP"; requirement = { kind = exactVersion; - version = 26.4.0; + version = 26.5.0; }; }; B3D84BEE27919FDE005DDD7C /* XCRemoteSwiftPackageReference "Starscream" */ = { diff --git a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 0bc34c3b0..9280a1585 100644 --- a/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Zotero.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Alamofire/Alamofire", "state" : { - "revision" : "7be73f6c2b5cd90e40798b06ebd5da8f9f79cf88", - "version" : "5.11.0" + "revision" : "3f99050e75bbc6fe71fc323adabb039756680016", + "version" : "5.11.1" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PSPDFKit/PSPDFKit-SP", "state" : { - "revision" : "7422bf221c71618ebd297806fc02ab27d9f1b4b7", - "version" : "26.4.0" + "revision" : "c97292f0cab8f0efd45ee210f5548a450fae5cd6", + "version" : "26.5.0" } }, { @@ -114,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/ReactiveX/RxSwift", "state" : { - "revision" : "5004a18539bd68905c5939aa893075f578f4f03d", - "version" : "6.9.1" + "revision" : "5734ad2b6d7d4c0656df3d09ca4ce54fa3c09913", + "version" : "6.10.1" } }, { diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index 238b189d1..7f5bae976 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -1545,7 +1545,9 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi // TODO: Remove if issues are fixed in PSPDFKit /// Transforms highlight/underline annotation if needed. /// (a) Merges rects that are in the same text line. - /// (b) Trims different line rects that overlap. (only for highlight annotations) + /// (b) Trims different line rects that overlap. This is needed only for highlight annotations. + /// PSPDFKit 26.5.0 fixed the highlight annotation rendering so that overlapping rects don't blend, + /// but rects values are exactly the same as before, so we still need to transform them for our needs. /// If not a higlight/underline annotation, or transformations are not needed, it returns nil. /// Issue appeared in PSPDFKit 13.5.0 /// - parameter annotation: Annotation to be transformed if needed From f1873050f0763873cde4390b6a7ba3141f2b59aa Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 18 Feb 2026 15:29:29 +0200 Subject: [PATCH 71/75] Fix sync error show item (#1240) * Fix sync error show item logic * Ignore deleted attachments when reading them for upload * Add tests for ignoring deleted attachments when reading them for upload --- Zotero.xcodeproj/project.pbxproj | 8 +- .../CheckAnyItemIsInTrashDbRequest.swift | 24 ---- .../ReadAttachmentUploadsDbRequest.swift | 10 ++ Zotero/Models/Predicates.swift | 13 +- .../General/Views/SyncToolbarController.swift | 34 ++++- .../Main/Views/MainViewController.swift | 23 +--- .../ReadAttachmentUploadsDbRequestSpec.swift | 119 ++++++++++++++++++ 7 files changed, 176 insertions(+), 55 deletions(-) delete mode 100644 Zotero/Controllers/Database/Requests/CheckAnyItemIsInTrashDbRequest.swift create mode 100644 ZoteroTests/ReadAttachmentUploadsDbRequestSpec.swift diff --git a/Zotero.xcodeproj/project.pbxproj b/Zotero.xcodeproj/project.pbxproj index 6c5f3d42b..3d319356d 100644 --- a/Zotero.xcodeproj/project.pbxproj +++ b/Zotero.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 6144B5D62A4ADD7E00914B3C /* ItemResponseSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B1EDEC250242DB00D8BC1E /* ItemResponseSpec.swift */; }; 6144B5D72A4ADD8400914B3C /* TestControllers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3202C6427103DEE00485BE4 /* TestControllers.swift */; }; 6144B5D82A4ADDC400914B3C /* ItemTitleFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B34F9FA423743C42004ED34C /* ItemTitleFormatterSpec.swift */; }; + 561E08F0D1D341A09184D875 /* ReadAttachmentUploadsDbRequestSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6869C0F7335B4F30B5D8C9EC /* ReadAttachmentUploadsDbRequestSpec.swift */; }; 6144B5D92A4ADEB500914B3C /* ReadUpdatedItemUpdateParametersSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39C7BDD251237D600C2CCF1 /* ReadUpdatedItemUpdateParametersSpec.swift */; }; 6144B5DA2A4ADEBD00914B3C /* WebDavCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = B31DDAA02729A7DC002CFA05 /* WebDavCredentials.swift */; }; 6144B5DB2A4ADEEB00914B3C /* SearchResponseSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B1EDF0250242F700D8BC1E /* SearchResponseSpec.swift */; }; @@ -663,7 +664,6 @@ B357DEE7241661E300E06153 /* DebugLogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B357DEE124165DEE00E06153 /* DebugLogging.swift */; }; B357DEE8241661E500E06153 /* DebugLogFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B357DEE524165E0B00E06153 /* DebugLogFormatter.swift */; }; B3588C6925FF7A800049D484 /* SetCollectionCollapsedDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3588C6825FF7A800049D484 /* SetCollectionCollapsedDbRequest.swift */; }; - B358D3B4279590C200A67054 /* CheckAnyItemIsInTrashDbRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B358D3B3279590C200A67054 /* CheckAnyItemIsInTrashDbRequest.swift */; }; B3593ADC24B60A7600CA0B57 /* UISearchBar+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3593ADB24B60A7600CA0B57 /* UISearchBar+Extensions.swift */; }; B3593F162668E29C00FA4BB2 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3593F152668E29C00FA4BB2 /* Style.swift */; }; B3593F182668E6A700FA4BB2 /* StyleParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3593F172668E6A700FA4BB2 /* StyleParserDelegate.swift */; }; @@ -1785,7 +1785,6 @@ B357DEE224165DEE00E06153 /* CrashReporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrashReporter.swift; sourceTree = ""; }; B357DEE524165E0B00E06153 /* DebugLogFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugLogFormatter.swift; sourceTree = ""; }; B3588C6825FF7A800049D484 /* SetCollectionCollapsedDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetCollectionCollapsedDbRequest.swift; sourceTree = ""; }; - B358D3B3279590C200A67054 /* CheckAnyItemIsInTrashDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckAnyItemIsInTrashDbRequest.swift; sourceTree = ""; }; B3593ADB24B60A7600CA0B57 /* UISearchBar+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchBar+Extensions.swift"; sourceTree = ""; }; B3593EC5241A61C700760E20 /* ItemDetailActionHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemDetailActionHandler.swift; sourceTree = ""; }; B3593EC9241A61C700760E20 /* ItemDetailState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemDetailState.swift; sourceTree = ""; }; @@ -2147,6 +2146,7 @@ B399A9182CC6802E00731B21 /* TrashObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrashObject.swift; sourceTree = ""; }; B39AF553290033CD001F400F /* TableOfContentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableOfContentsViewController.swift; sourceTree = ""; }; B39B18E7223947050019F467 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 6869C0F7335B4F30B5D8C9EC /* ReadAttachmentUploadsDbRequestSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadAttachmentUploadsDbRequestSpec.swift; sourceTree = ""; }; B39C7BDD251237D600C2CCF1 /* ReadUpdatedItemUpdateParametersSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadUpdatedItemUpdateParametersSpec.swift; sourceTree = ""; }; B39D336723FFD96C00EF2ACB /* Note.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Note.swift; sourceTree = ""; }; B39D33702400150B00EF2ACB /* CreateAttachmentsDbRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateAttachmentsDbRequest.swift; sourceTree = ""; }; @@ -2674,7 +2674,6 @@ B305CEBA29E6E67600B9E2B4 /* AssignItemsToTagDbRequest.swift */, B352FFCB2CBE943B00D0887B /* AutoEmptyTrashDbRequest.swift */, B37D21352AD6D8AB004A6496 /* CancelParentCreationDbRequest.swift */, - B358D3B3279590C200A67054 /* CheckAnyItemIsInTrashDbRequest.swift */, B305644423FC051E003304F2 /* CheckItemIsChangedDbRequest.swift */, B3E34888283CFA92002A8A06 /* CleanupUnusedTags.swift */, B3BD2F8F2BBEE38900EDDDD6 /* CountObjectsDbRequest.swift */, @@ -3193,6 +3192,7 @@ B3243BC72A5EB2740033A7D6 /* HtmlAttributedStringConverterSpec.swift */, B3B1EDEC250242DB00D8BC1E /* ItemResponseSpec.swift */, B34F9FA423743C42004ED34C /* ItemTitleFormatterSpec.swift */, + 6869C0F7335B4F30B5D8C9EC /* ReadAttachmentUploadsDbRequestSpec.swift */, B39C7BDD251237D600C2CCF1 /* ReadUpdatedItemUpdateParametersSpec.swift */, B3B1EDF0250242F700D8BC1E /* SearchResponseSpec.swift */, B3518DA62AEBCB5E00D983B4 /* SettingsResponseSpec.swift */, @@ -5845,7 +5845,6 @@ B3DCDF18240917500039ED0D /* ItemTypePickerViewModelCreator.swift in Sources */, B3A2AECE26553DD8004BF3A4 /* NavigationViewController.swift in Sources */, 6135EF9C2C2ABDD1008DA17B /* AnnotationManager.swift in Sources */, - B358D3B4279590C200A67054 /* CheckAnyItemIsInTrashDbRequest.swift in Sources */, B3B398542E4CCB20009C59F5 /* DocumentSearchCell.swift in Sources */, B3B398552E4CCB20009C59F5 /* DocumentSearchViewController.swift in Sources */, B3866A582417C1BC006693C4 /* ViewModel.swift in Sources */, @@ -6138,6 +6137,7 @@ buildActionMask = 2147483647; files = ( 6144B5E02A4AE49800914B3C /* TranslatorsControllerSpec.swift in Sources */, + 561E08F0D1D341A09184D875 /* ReadAttachmentUploadsDbRequestSpec.swift in Sources */, 6144B5D92A4ADEB500914B3C /* ReadUpdatedItemUpdateParametersSpec.swift in Sources */, B3EFC60B2B0F503E00CB71A0 /* EmojiExtractorSpec.swift in Sources */, 61C817F22A49B5D30085B1E6 /* CollectionResponseSpec.swift in Sources */, diff --git a/Zotero/Controllers/Database/Requests/CheckAnyItemIsInTrashDbRequest.swift b/Zotero/Controllers/Database/Requests/CheckAnyItemIsInTrashDbRequest.swift deleted file mode 100644 index 208113194..000000000 --- a/Zotero/Controllers/Database/Requests/CheckAnyItemIsInTrashDbRequest.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// CheckItemsInTrashDbRequest.swift -// Zotero -// -// Created by Michal Rentka on 17.01.2022. -// Copyright © 2022 Corporation for Digital Scholarship. All rights reserved. -// - -import Foundation - -import RealmSwift - -struct CheckAnyItemIsInTrashDbRequest: DbResponseRequest { - typealias Response = Bool - - let libraryId: LibraryIdentifier - let keys: [String] - - var needsWrite: Bool { return false } - - func process(in database: Realm) throws -> Bool { - return !database.objects(RItem.self).filter(.keys(self.keys, in: self.libraryId)).filter(.isTrash(true)).isEmpty - } -} diff --git a/Zotero/Controllers/Database/Requests/ReadAttachmentUploadsDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadAttachmentUploadsDbRequest.swift index 73c7e6656..332a4c401 100644 --- a/Zotero/Controllers/Database/Requests/ReadAttachmentUploadsDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadAttachmentUploadsDbRequest.swift @@ -22,6 +22,16 @@ struct ReadAttachmentUploadsDbRequest: DbResponseRequest { func process(in database: Realm) throws -> [AttachmentUpload] { let items = database.objects(RItem.self).filter(.itemsNotChangedAndNeedUpload(in: self.libraryId)) let uploads = items.compactMap({ item -> AttachmentUpload? in + guard !item.deleted else { + // This shouldn't happen based on itemsNotChangedAndNeedUpload filter. + DDLogInfo("ReadAttachmentUploadsDbRequest: skipping deleted attachment \(item.key)") + return nil + } + if item.parent?.deleted == true { + // This shouldn't happen based on itemsNotChangedAndNeedUpload filter. + DDLogInfo("ReadAttachmentUploadsDbRequest: skipping attachment with deleted parent \(item.key)") + return nil + } guard let contentType = item.fields.filter(.key(FieldKeys.Item.Attachment.contentType)).first?.value else { DDLogError("ReadAttachmentUploadsDbRequest: contentType field missing !!!") return nil diff --git a/Zotero/Models/Predicates.swift b/Zotero/Models/Predicates.swift index 9b50e41b2..205d8da4f 100644 --- a/Zotero/Models/Predicates.swift +++ b/Zotero/Models/Predicates.swift @@ -316,10 +316,15 @@ extension NSPredicate { } static func itemsNotChangedAndNeedUpload(in libraryId: LibraryIdentifier) -> NSPredicate { - return NSCompoundPredicate(andPredicateWithSubpredicates: [.notChanged, - .attachmentNeedsUpload, - .item(type: ItemTypes.attachment), - .library(with: libraryId)]) + let parentNotDeleted = NSPredicate(format: "parent = nil or parent.deleted = false") + return NSCompoundPredicate(andPredicateWithSubpredicates: [ + .notChanged, + .attachmentNeedsUpload, + .item(type: ItemTypes.attachment), + .library(with: libraryId), + .deleted(false), + parentNotDeleted + ]) } static func itemSearch(for components: [String]) -> NSPredicate { diff --git a/Zotero/Scenes/General/Views/SyncToolbarController.swift b/Zotero/Scenes/General/Views/SyncToolbarController.swift index 604898a17..842e69d62 100644 --- a/Zotero/Scenes/General/Views/SyncToolbarController.swift +++ b/Zotero/Scenes/General/Views/SyncToolbarController.swift @@ -8,6 +8,7 @@ import UIKit +import CocoaLumberjackSwift import RxSwift final class SyncToolbarController { @@ -115,19 +116,44 @@ final class SyncToolbarController { guard let error = errors.first else { return } - let (message, data) = alertMessage(from: error) + var (message, data) = alertMessage(from: error) + var showItemsData: (keys: [String], libraryId: LibraryIdentifier, collectionCustomType: CollectionIdentifier.CustomType)? + + if let data, let keys = data.itemKeys, !keys.isEmpty { + if let collectionCustomType = getItemsCollectionCustomType(for: keys, libraryId: data.libraryId, dbStorage: dbStorage) { + showItemsData = (keys, data.libraryId, collectionCustomType) + } else { + message += "\n\n\(L10n.notFound)" + } + } let controller = UIAlertController(title: L10n.error, message: message, preferredStyle: .alert) controller.addAction(UIAlertAction(title: L10n.ok, style: .cancel, handler: { [weak self] _ in self?.pendingErrors = nil })) - if let data = data, let keys = data.itemKeys, !keys.isEmpty { - let title = keys.count == 1 ? L10n.Errors.SyncToolbar.showItem : L10n.Errors.SyncToolbar.showItems + if let showItemsData { + let title = showItemsData.keys.count == 1 ? L10n.Errors.SyncToolbar.showItem : L10n.Errors.SyncToolbar.showItems controller.addAction(UIAlertAction(title: title, style: .default, handler: { [weak self] _ in - self?.coordinatorDelegate?.showItems(with: keys, in: data.libraryId) + self?.coordinatorDelegate?.showItems(with: showItemsData.keys, in: showItemsData.libraryId, collectionType: showItemsData.collectionCustomType) })) } viewController.present(controller, animated: true, completion: nil) + + func getItemsCollectionCustomType(for keys: [String], libraryId: LibraryIdentifier, dbStorage: DbStorage) -> CollectionIdentifier.CustomType? { + do { + let all = try dbStorage.perform(request: ReadItemsDbRequest(collectionId: .custom(.all), libraryId: libraryId, searchTextComponents: keys), on: .main) + if !all.isEmpty { + return .all + } + let trash = try dbStorage.perform(request: ReadItemsDbRequest(collectionId: .custom(.trash), libraryId: libraryId, searchTextComponents: keys), on: .main) + if !trash.isEmpty { + return .trash + } + } catch let error { + DDLogError("SyncToolbarController: can't resolve items collection custom type - \(error)") + } + return nil + } } private func alertMessage(from error: Error) -> (message: String, additionalData: SyncError.ErrorData?) { diff --git a/Zotero/Scenes/Main/Views/MainViewController.swift b/Zotero/Scenes/Main/Views/MainViewController.swift index 7b0ae03f5..1cc65710c 100644 --- a/Zotero/Scenes/Main/Views/MainViewController.swift +++ b/Zotero/Scenes/Main/Views/MainViewController.swift @@ -21,7 +21,7 @@ protocol MainCoordinatorDelegate: AnyObject { } protocol MainCoordinatorSyncToolbarDelegate: AnyObject { - func showItems(with keys: [String], in libraryId: LibraryIdentifier) + func showItems(with keys: [String], in libraryId: LibraryIdentifier, collectionType: CollectionIdentifier.CustomType) } final class MainViewController: UISplitViewController { @@ -166,23 +166,8 @@ extension MainViewController: MainCoordinatorDelegate { } extension MainViewController: MainCoordinatorSyncToolbarDelegate { - func showItems(with keys: [String], in libraryId: LibraryIdentifier) { - guard let dbStorage = controllers.userControllers?.dbStorage else { return } - - do { - var collectionType: CollectionIdentifier.CustomType? - - try dbStorage.perform(on: .main, with: { coordinator in - let isAnyInTrash = try coordinator.perform(request: CheckAnyItemIsInTrashDbRequest(libraryId: libraryId, keys: keys)) - collectionType = isAnyInTrash ? .trash : .all - }) - - guard let collectionType else { return } - - masterCoordinator?.showCollections(for: libraryId, preselectedCollection: .custom(collectionType), animated: true) - showItems(for: Collection(custom: collectionType), in: libraryId, searchItemKeys: keys) - } catch let error { - DDLogError("MainViewController: can't load searched keys - \(error)") - } + func showItems(with keys: [String], in libraryId: LibraryIdentifier, collectionType: CollectionIdentifier.CustomType) { + masterCoordinator?.showCollections(for: libraryId, preselectedCollection: .custom(collectionType), animated: true) + showItems(for: Collection(custom: collectionType), in: libraryId, searchItemKeys: keys) } } diff --git a/ZoteroTests/ReadAttachmentUploadsDbRequestSpec.swift b/ZoteroTests/ReadAttachmentUploadsDbRequestSpec.swift new file mode 100644 index 000000000..b85381cdc --- /dev/null +++ b/ZoteroTests/ReadAttachmentUploadsDbRequestSpec.swift @@ -0,0 +1,119 @@ +// +// ReadAttachmentUploadsDbRequestSpec.swift +// ZoteroTests +// +// Created by Miltiadis Vasilakis on 18/2/26. +// Copyright © 2026 Corporation for Digital Scholarship. All rights reserved. +// + +import Foundation + +@testable import Zotero + +import RealmSwift +import Nimble +import Quick + +final class ReadAttachmentUploadsDbRequestSpec: QuickSpec { + override class func spec() { + describe("a read attachment uploads request") { + let libraryId: LibraryIdentifier = .custom(.myLibrary) + var realm: Realm! + var fileStorage: FileStorageController! + + beforeEach { + let config = Realm.Configuration(inMemoryIdentifier: UUID().uuidString) + realm = try! Realm(configuration: config) + fileStorage = FileStorageController() + + try! realm.write { + let library = RCustomLibrary() + library.type = .myLibrary + realm.add(library) + } + } + + func createField(_ key: String, value: String) -> RItemField { + let field = RItemField() + field.key = key + field.value = value + field.changed = false + return field + } + + func createParent(key: String, deleted: Bool) -> RItem { + let parent = RItem() + parent.key = key + parent.rawType = "journalArticle" + parent.customLibraryKey = .myLibrary + parent.deleted = deleted + return parent + } + + func createAttachment(key: String, deleted: Bool = false, parent: RItem? = nil) -> RItem { + let item = RItem() + item.key = key + item.rawType = ItemTypes.attachment + item.customLibraryKey = .myLibrary + item.attachmentNeedsSync = true + item.deleted = deleted + item.parent = parent + item.fields.append(createField(FieldKeys.Item.Attachment.linkMode, value: LinkMode.importedFile.rawValue)) + item.fields.append(createField(FieldKeys.Item.Attachment.contentType, value: "application/pdf")) + item.fields.append(createField(FieldKeys.Item.Attachment.mtime, value: "123")) + item.fields.append(createField(FieldKeys.Item.Attachment.md5, value: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) + item.fields.append(createField(FieldKeys.Item.Attachment.filename, value: "\(key).pdf")) + return item + } + + it("returns non-deleted attachments that need upload") { + let key = "AAAAAAAA" + + try! realm.write { + realm.add(createAttachment(key: key)) + } + + let request = ReadAttachmentUploadsDbRequest(libraryId: libraryId, fileStorage: fileStorage) + let uploads = try! request.process(in: realm) + + expect(uploads.map({ $0.key })).to(equal([key])) + } + + it("does not return deleted attachments") { + let validKey = "AAAAAAAA" + let deletedKey = "BBBBBBBB" + + try! realm.write { + realm.add(createAttachment(key: validKey)) + realm.add(createAttachment(key: deletedKey, deleted: true)) + } + + let request = ReadAttachmentUploadsDbRequest(libraryId: libraryId, fileStorage: fileStorage) + let uploads = try! request.process(in: realm) + let keys = Set(uploads.map({ $0.key })) + + expect(keys.contains(validKey)).to(beTrue()) + expect(keys.contains(deletedKey)).to(beFalse()) + } + + it("does not return attachments with deleted parent") { + let validKey = "AAAAAAAA" + let childKey = "BBBBBBBB" + + try! realm.write { + let deletedParent = createParent(key: "CCCCCCCC", deleted: true) + realm.add(deletedParent) + realm.add(createAttachment(key: validKey)) + realm.add(createAttachment(key: childKey, parent: deletedParent)) + } + + let request = ReadAttachmentUploadsDbRequest(libraryId: libraryId, fileStorage: fileStorage) + let uploads = try! request.process(in: realm) + let keys = Set(uploads.map({ $0.key })) + + expect(keys.contains(validKey)).to(beTrue()) + expect(keys.contains(childKey)).to(beFalse()) + } + } + } +} From 2401cb9fa4cfc620bbe1ff2073d6106a4ee5e6e1 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 20 Feb 2026 20:55:57 +0200 Subject: [PATCH 72/75] Fix SplitAnnotationsDbRequest typo bug --- .../Database/Requests/SplitAnnotationsDbRequest.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotero/Controllers/Database/Requests/SplitAnnotationsDbRequest.swift b/Zotero/Controllers/Database/Requests/SplitAnnotationsDbRequest.swift index a474cec5a..ded946817 100644 --- a/Zotero/Controllers/Database/Requests/SplitAnnotationsDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/SplitAnnotationsDbRequest.swift @@ -39,7 +39,7 @@ struct SplitAnnotationsDbRequest: DbRequest { switch annotationType { case .highlight, .underline: - let rects = item.rects.map({ CGRect(x: $0.minX, y: $0.minY, width: ($0.maxX - $0.minY), height: ($0.maxY - $0.minY)) }) + let rects = item.rects.map({ CGRect(x: $0.minX, y: $0.minY, width: ($0.maxX - $0.minX), height: ($0.maxY - $0.minY)) }) guard let splitRects = AnnotationSplitter.splitRectsIfNeeded(rects: Array(rects)) else { return } From 1386145b3a45257163b4b70c2ad2b88161d5e514 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Fri, 22 Sep 2023 12:52:37 +0300 Subject: [PATCH 73/75] Add support for multiple open items Improve AppCoordinator code Keep track of open items count in items navigation bar Add ability to restore most recently opened item Implement state restoration for open items Allow switch to another open item via bar button menu Use instant presenter to switch between open items Maintain user order of open items Add support for notes in open items Validate open items when set on app launch Observe open items for deletions Add support for different open items per session Improve DetailCoordinator presented item replacement for multiple items Set user activity when new note is actually created Show actions submenu for current item Improve ItemsViewController right bar button items Add icons item type icons to open items menu Add close all action to open items menu Simplify NoteEditorViewController open items button creation Add PDFReaderViewController open items observer Add close other items action to submenu for current item Add getSessionIdentifier convenience property to UIViewController Save user activity when open items change w/o current item change Open items in their respective scene, if already open Update copy Improve NSUserActivity extension Simplify DetailCoordinator Improve open items bar button image creation Improve open items bar button creation Properly close PDF Reader when switching current open item Properly close Note Editor when switching current open item Improve note editor save callback for new notes Improve note editor activity title update Improve NoteEditorActionHandler Refactor PDFReaderState Improve PDFReaderActionHandler Pass note title when showing note editor Clarify NoteEditorState parameter names Make OpenItemsController restoration methods asynchronous In OpenItemsController download remote or local changed remotely PDFs Use feature gate for multiple open items Fix opening URLs with multiple open items Refactor open items controller load presentation methods Refactor custom URL controller Open item from note editor link with multiple items support Enable multiple open items feature gate --- FeatureGates.xcconfig | 2 +- Zotero/Assets/en.lproj/Localizable.strings | 8 + .../Architecture/Coordinator.swift | 2 +- Zotero/Controllers/Controllers.swift | 4 +- Zotero/Controllers/CustomURLController.swift | 87 +-- .../Requests/ReadItemsDbRequest.swift | 12 + Zotero/Controllers/OpenItemsController.swift | 602 +++++++++++++++++- .../NSUserActivity+Activities.swift | 8 +- .../UIViewController+Extensions.swift | 4 + Zotero/Models/Predicates.swift | 4 + Zotero/SceneDelegate.swift | 9 +- Zotero/Scenes/AppCoordinator.swift | 244 +++---- Zotero/Scenes/Detail/DetailCoordinator.swift | 194 ++++-- .../HTML:EPUB/HtmlEpubCoordinator.swift | 18 +- .../Models/HtmlEpubReaderAction.swift | 1 + .../Models/HtmlEpubReaderState.swift | 6 +- .../HtmlEpubReaderActionHandler.swift | 7 + .../Views/HtmlEpubReaderViewController.swift | 72 ++- .../Detail/Items/Models/ItemsAction.swift | 1 + .../Detail/Items/Models/ItemsState.swift | 6 +- .../Items/ViewModels/ItemsActionHandler.swift | 8 + .../Items/Views/BaseItemsViewController.swift | 46 +- .../Items/Views/ItemsViewController.swift | 49 +- .../Detail/PDF/Models/PDFReaderAction.swift | 1 + .../Detail/PDF/Models/PDFReaderState.swift | 8 +- Zotero/Scenes/Detail/PDF/PDFCoordinator.swift | 19 +- .../ViewModels/PDFReaderActionHandler.swift | 7 + .../PDF/Views/PDFReaderViewController.swift | 69 +- .../Detail/Trash/Models/TrashAction.swift | 1 + .../Detail/Trash/Models/TrashState.swift | 5 +- .../Trash/ViewModels/TrashActionHandler.swift | 8 + .../Trash/Views/TrashViewController.swift | 46 +- .../General/Models/NoteEditorAction.swift | 1 + .../General/Models/NoteEditorState.swift | 5 +- .../General/NoteEditorCoordinator.swift | 94 +-- .../ViewModels/NoteEditorActionHandler.swift | 7 + .../Views/NavigationViewController.swift | 22 + .../Views/NoteEditorViewController.swift | 158 +++-- .../Main/Views/MainViewController.swift | 18 +- 39 files changed, 1453 insertions(+), 410 deletions(-) diff --git a/FeatureGates.xcconfig b/FeatureGates.xcconfig index 1275c1a0a..9c3923c91 100644 --- a/FeatureGates.xcconfig +++ b/FeatureGates.xcconfig @@ -1 +1 @@ -SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) FEATURE_GATE_HTML_EPUB_READER FEATURE_GATE_PDF_WORKER +SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) FEATURE_GATE_HTML_EPUB_READER FEATURE_GATE_PDF_WORKER FEATURE_GATE_MULTIPLE_OPEN_ITEMS diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 44a58829b..76f811046 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -150,6 +150,7 @@ "items.creator_summary.etal" = "%@ et al."; "items.retrieving_metadata" = "Retrieving Metadata"; "items.collections_select_prompt" = "Select a Collection"; +"items.restore_open" = "Restore Open Items"; "lookup.title" = "Enter ISBNs, DOIs, PMIDs, arXiv IDs, or ADS Bibcodes to add to your library:"; @@ -591,6 +592,13 @@ "accessibility.pdf.undo" = "Undo"; "accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; "accessibility.pdf.show_more_tools" = "Show more"; +"accessibility.pdf.open_items" = "Open Items"; +"accessibility.pdf.current_item" = "Current Item"; +"accessibility.pdf.current_item_close" = "Close"; +"accessibility.pdf.current_item_move_to_start" = "Move to start"; +"accessibility.pdf.current_item_move_to end" = "Move to end"; +"accessibility.pdf.close_all_open_items" = "Close all"; +"accessibility.pdf.close_other_open_items" = "Close other items"; "accessibility.htmlepub.search_html" = "Search Website"; "accessibility.htmlepub.search_epub" = "Search EPUB"; "accessibility.speech.play" = "Start speaking"; diff --git a/Zotero/Controllers/Architecture/Coordinator.swift b/Zotero/Controllers/Architecture/Coordinator.swift index 5e0aa118a..a2730bbd8 100644 --- a/Zotero/Controllers/Architecture/Coordinator.swift +++ b/Zotero/Controllers/Architecture/Coordinator.swift @@ -16,7 +16,7 @@ private enum Source { protocol Coordinator: AnyObject { var parentCoordinator: Coordinator? { get set } var childCoordinators: [Coordinator] { get set } - var navigationController: UINavigationController? { get } + var navigationController: UINavigationController? { get set } func start(animated: Bool) func childDidFinish(_ child: Coordinator) diff --git a/Zotero/Controllers/Controllers.swift b/Zotero/Controllers/Controllers.swift index 2db2e3cac..2dafa5159 100644 --- a/Zotero/Controllers/Controllers.swift +++ b/Zotero/Controllers/Controllers.swift @@ -304,6 +304,7 @@ final class UserControllers { let webDavController: WebDavController let customUrlController: CustomURLController let fullSyncDebugger: FullSyncDebugger + let openItemsController: OpenItemsController private let isFirstLaunch: Bool private let lastBuildNumber: Int? private unowned let translatorsAndStylesController: TranslatorsAndStylesController @@ -402,7 +403,8 @@ final class UserControllers { translatorsAndStylesController = controllers.translatorsAndStylesController fullSyncDebugger = FullSyncDebugger(syncScheduler: syncScheduler, debugLogging: controllers.debugLogging, sessionController: controllers.sessionController) idleTimerController = controllers.idleTimerController - customUrlController = CustomURLController(dbStorage: dbStorage, fileStorage: controllers.fileStorage) + openItemsController = OpenItemsController(dbStorage: dbStorage, fileStorage: controllers.fileStorage, attachmentDownloader: fileDownloader) + customUrlController = CustomURLController(dbStorage: dbStorage, openItemsController: openItemsController) lastBuildNumber = controllers.lastBuildNumber disposeBag = DisposeBag() } diff --git a/Zotero/Controllers/CustomURLController.swift b/Zotero/Controllers/CustomURLController.swift index da9931261..7aefd90ff 100644 --- a/Zotero/Controllers/CustomURLController.swift +++ b/Zotero/Controllers/CustomURLController.swift @@ -19,29 +19,32 @@ final class CustomURLController { enum Kind { case itemDetail(key: String, libraryId: LibraryIdentifier, preselectedChildKey: String?) - case itemReader(presentation: ItemPresentation, attachment: Attachment, isAvailable: Bool) + case itemReader(presentation: ItemPresentation) } private unowned let dbStorage: DbStorage - private unowned let fileStorage: FileStorage + private unowned let openItemsController: OpenItemsController - init(dbStorage: DbStorage, fileStorage: FileStorage) { + init(dbStorage: DbStorage, openItemsController: OpenItemsController) { self.dbStorage = dbStorage - self.fileStorage = fileStorage + self.openItemsController = openItemsController } - func process(url: URL) -> Kind? { + func process(url: URL, completion: @escaping(Kind?) -> Void) { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), components.scheme == "zotero", let action = components.host.flatMap({ CustomURLAction(rawValue: $0) }) - else { return nil } + else { + completion(nil) + return + } switch action { case .select: - return select(path: components.path) + completion(select(path: components.path)) case .openItem: - return openItem(path: components.path, queryItems: components.queryItems ?? []) + openItem(path: components.path, queryItems: components.queryItems ?? [], completion: completion) } func select(path: String) -> Kind? { @@ -59,67 +62,13 @@ final class CustomURLController { } } - func openItem(path: String, queryItems: [URLQueryItem]) -> Kind? { - guard let (key, libraryId, page, annotation) = extractProperties(from: path, and: queryItems, extractPageAndAnnotation: true, allowZotFileFormat: true) else { return nil } - return loadItemReaderKind(on: page, annotation: annotation, key: key, libraryId: libraryId) - - func loadItemReaderKind(on page: Int?, annotation: String?, key: String, libraryId: LibraryIdentifier) -> Kind? { - var library: Library? - var item: RItem? - do { - try dbStorage.perform(on: .main) { coordinator in - library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) - item = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) - } - } catch let error { - DDLogError("CustomURLConverter: library (\(libraryId)) or item (\(key)) not found - \(error)") - return nil - } - guard let library, let item else { return nil } - guard let attachment = AttachmentCreator.attachment(for: item, fileStorage: fileStorage, urlDetector: nil) else { - DDLogInfo("CustomURLConverter: trying to open incorrect item - \(item.rawType)") - return nil - } - guard case .file(let filename, let contentType, let location, _, _) = attachment.type else { - DDLogInfo("CustomURLConverter: trying to open invalid attachment type \(attachment.type)") - return nil - } - let parentKey = item.parent?.key - let file = Files.attachmentFile(in: libraryId, key: attachment.key, filename: filename, contentType: contentType) - let url = file.createUrl() - var presentation: ItemPresentation? - switch contentType { - case "application/pdf": - presentation = .pdf(library: library, key: key, parentKey: parentKey, url: url, page: page, preselectedAnnotationKey: annotation, previewRects: nil) - - case "text/html": - if FeatureGates.enabled.contains(.htmlEpubReader) { - presentation = .html(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: annotation) - } - - case "application/epub+zip": - if FeatureGates.enabled.contains(.htmlEpubReader) { - presentation = .epub(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: annotation) - } - - default: - break - } - guard let presentation else { - DDLogInfo("CustomURLConverter: trying to open invalid content type \(contentType)") - return nil - } - switch location { - case .local: - return .itemReader(presentation: presentation, attachment: attachment, isAvailable: true) - - case .remote, .localAndChangedRemotely: - return .itemReader(presentation: presentation, attachment: attachment, isAvailable: false) - - case .remoteMissing: - DDLogInfo("CustomURLConverter: attachment \(attachment.key) missing remotely") - return nil - } + func openItem(path: String, queryItems: [URLQueryItem], completion: @escaping(Kind?) -> Void) { + guard let (key, libraryId, page, annotation) = extractProperties(from: path, and: queryItems, extractPageAndAnnotation: true, allowZotFileFormat: true) else { + completion(nil) + return + } + openItemsController.loadPresentation(for: key, libraryId: libraryId, page: page, preselectedAnnotationKey: annotation, previewRects: nil) { presentation in + completion(presentation.flatMap { Kind.itemReader(presentation: $0) }) } } diff --git a/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift b/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift index f0319ae60..a3c35ec15 100644 --- a/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift +++ b/Zotero/Controllers/Database/Requests/ReadItemsDbRequest.swift @@ -89,3 +89,15 @@ struct ReadLibraryItemsDbRequest: DbResponseRequest { return database.objects(RItem.self).filter(.items(for: libraryId)) } } + +struct ReadItemsWithKeysFromMultipleLibrariesDbRequest: DbResponseRequest { + typealias Response = Results + + let keysByLibraryIdentifier: [LibraryIdentifier: Set] + + var needsWrite: Bool { return false } + + func process(in database: Realm) throws -> Results { + database.objects(RItem.self).filter(.keysByLibraryIdentifier(keysByLibraryIdentifier)) + } +} diff --git a/Zotero/Controllers/OpenItemsController.swift b/Zotero/Controllers/OpenItemsController.swift index 58a617f8f..09e24a962 100644 --- a/Zotero/Controllers/OpenItemsController.swift +++ b/Zotero/Controllers/OpenItemsController.swift @@ -7,6 +7,9 @@ // import UIKit +import RxSwift +import RealmSwift +import CocoaLumberjackSwift typealias OpenItem = OpenItemsController.Item typealias ItemPresentation = OpenItemsController.Presentation @@ -48,7 +51,7 @@ final class OpenItemsController { return Asset.Images.ItemTypes.webPageSnapshot.image case .epub: - return Asset.Images.ItemTypes.document.image + return Asset.Images.ItemTypes.epub.image case .note: return Asset.Images.ItemTypes.note.image @@ -154,5 +157,602 @@ final class OpenItemsController { return nil } } + + var kind: Item.Kind { + switch self { + case .pdf: + return .pdf(libraryId: library.identifier, key: key) + + case .html: + return .html(libraryId: library.identifier, key: key) + + case .epub: + return .epub(libraryId: library.identifier, key: key) + + case .note: + return .note(libraryId: library.identifier, key: key) + } + } + } + + // MARK: Properties + private unowned let dbStorage: DbStorage + private unowned let fileStorage: FileStorage + private unowned let attachmentDownloader: AttachmentDownloader + // TODO: Use a better data structure, such as an ordered set + private var itemsBySessionIdentifier: [String: [Item]] = [:] + private var sessionIdentifierByItemKind: [Item.Kind: String] = [:] + private var itemsTokenBySessionIdentifier: [String: NotificationToken] = [:] + private var observableBySessionIdentifier: [String: PublishSubject<[Item]>] = [:] + private let disposeBag: DisposeBag + private var downloadDisposeBag: DisposeBag? + + // MARK: Object Lifecycle + init(dbStorage: DbStorage, fileStorage: FileStorage, attachmentDownloader: AttachmentDownloader) { + self.dbStorage = dbStorage + self.fileStorage = fileStorage + self.attachmentDownloader = attachmentDownloader + disposeBag = DisposeBag() + } + + // MARK: Actions + func observable(for sessionIdentifier: String) -> PublishSubject<[Item]> { + if let observable = observableBySessionIdentifier[sessionIdentifier] { + return observable + } + let observable = PublishSubject<[Item]>() + observableBySessionIdentifier[sessionIdentifier] = observable + return observable + } + + func getItems(for sessionIdentifier: String) -> [Item] { + itemsBySessionIdentifier[sessionIdentifier, default: []] + } + + func set(items: [Item], for sessionIdentifier: String, validate: Bool) { + DDLogInfo("OpenItemsController: setting items \(items) for \(sessionIdentifier)") + let existingItems = getItems(for: sessionIdentifier) + var newItems = validate ? filterValidItems(items) : items + if !FeatureGates.enabled.contains(.multipleOpenItems), newItems.count > 1 { + newItems = Array(newItems[0..<1]) + } + guard newItems != existingItems else { return } + // Invalidate previous observer first. + itemsTokenBySessionIdentifier[sessionIdentifier]?.invalidate() + itemsTokenBySessionIdentifier[sessionIdentifier] = nil + // Update itemsBySessionIdentifier. + itemsBySessionIdentifier[sessionIdentifier] = newItems + // Update sessionIdentifierByItemKind. Recompute for all session identifier, to remove any closed items. + var newSessionIdentifierByItemKind: [Item.Kind: String] = [:] + itemsBySessionIdentifier.forEach { (sessionIdentifier, items) in + items.forEach { item in + newSessionIdentifierByItemKind[item.kind] = sessionIdentifier + } + } + sessionIdentifierByItemKind = newSessionIdentifierByItemKind + // Register observer for newly set items. + itemsTokenBySessionIdentifier[sessionIdentifier] = registerObserver(for: newItems) + observable(for: sessionIdentifier).on(.next(newItems)) + + func registerObserver(for items: [Item]) -> NotificationToken? { + var token: NotificationToken? + var keysByLibraryIdentifier: [LibraryIdentifier: Set] = [:] + for item in items { + let libraryId = item.kind.libraryId + let key = item.kind.key + var keys = keysByLibraryIdentifier[libraryId, default: .init()] + keys.insert(key) + keysByLibraryIdentifier[libraryId] = keys + } + do { + let objects = try dbStorage.perform(request: ReadItemsWithKeysFromMultipleLibrariesDbRequest(keysByLibraryIdentifier: keysByLibraryIdentifier), on: .main) + token = objects.observe { [weak self] changes in + switch changes { + case .initial: + break + + case .update(_, let deletions, _, _): + if !deletions.isEmpty, let self { + // Observed items have been deleted, call setItems to validate and register new observer. + let existingItems = getItems(for: sessionIdentifier) + set(items: existingItems, for: sessionIdentifier, validate: true) + } + + case .error(let error): + DDLogError("OpenItemsController: register observer error - \(error)") + } + } + } catch let error { + DDLogError("OpenItemsController: can't register items observer - \(error)") + } + return token + } + } + + private func setItemsSortedByUserIndex(_ items: [Item], for sessionIdentifier: String, validate: Bool) { + var newItems = items + for i in 0.. String? { + sessionIdentifierByItemKind[kind] + } + + func open(_ kind: Item.Kind, for sessionIdentifier: String) { + DDLogInfo("OpenItemsController: opened item \(kind) for \(sessionIdentifier)") + var existingItems = getItems(for: sessionIdentifier) + if let index = existingItems.firstIndex(where: { $0.kind == kind }) { + existingItems[index].lastOpened = .now + // No need to call setItems, to register a new items observer, as only items metadata were updated. + itemsBySessionIdentifier[sessionIdentifier] = existingItems + DDLogInfo("OpenItemsController: already opened item \(kind) became most recent for \(sessionIdentifier)") + observable(for: sessionIdentifier).on(.next(existingItems)) + } else { + DDLogInfo("OpenItemsController: newly opened item \(kind) set as most recent for \(sessionIdentifier)") + let item = Item(kind: kind, userIndex: existingItems.count) + let newItems = existingItems + [item] + // setItems will produce next observable event + set(items: newItems, for: sessionIdentifier, validate: false) + } + } + + func close(_ kind: Item.Kind, for sessionIdentifier: String) { + DDLogInfo("OpenItemsController: closed open item \(kind) for \(sessionIdentifier)") + var existingItems = itemsSortedByUserOrder(for: sessionIdentifier) + guard let index = existingItems.firstIndex(where: { $0.kind == kind }) else { + DDLogWarn("OpenItemsController: item was already closed") + return + } + existingItems.remove(at: index) + setItemsSortedByUserIndex(existingItems, for: sessionIdentifier, validate: false) + } + + func move(_ kind: Item.Kind, to userIndex: Int, for sessionIdentifier: String) { + DDLogInfo("OpenItemsController: moved open item \(kind) to user index \(userIndex) for \(sessionIdentifier)") + var existingItems = itemsSortedByUserOrder(for: sessionIdentifier) + let userIndex = min(existingItems.count, max(0, userIndex)) + guard let index = existingItems.firstIndex(where: { $0.kind == kind }) else { + DDLogWarn("OpenItemsController: item was not open") + return + } + existingItems.move(fromOffsets: IndexSet(integer: index), toOffset: userIndex) + setItemsSortedByUserIndex(existingItems, for: sessionIdentifier, validate: false) + } + + func restore(_ item: Item, using presenter: OpenItemsPresenter, completion: @escaping (Bool) -> Void) { + loadPresentation(for: item.kind) { [weak presenter] presentation in + guard let presenter, let presentation else { + completion(false) + return + } + presenter.showItem(with: presentation) + DDLogInfo("OpenItemsController: presenter \(presenter) presented item with presentation \(presentation)") + completion(true) + } + } + + func restoreMostRecentlyOpenedItem(using presenter: OpenItemsPresenter, sessionIdentifier: String, completion: @escaping (Item?) -> Void) { + // Will restore most recent opened item still present, or none if all fail + var existingItems = getItems(for: sessionIdentifier) + DDLogInfo("OpenItemsController: restoring most recently opened item using presenter \(presenter) for \(sessionIdentifier)") + let existingItemsSortedByLastOpen = itemsSortedByLastOpen(for: sessionIdentifier) + loadFirstAvailablePresentation(from: existingItemsSortedByLastOpen, indexOffset: 0) { [weak self, weak presenter] item, presentation, foundIndex in + if let self, foundIndex > 0 { + for item in existingItemsSortedByLastOpen[0..")") + } + completion(item) + } + + func loadFirstAvailablePresentation(from items: [Item], indexOffset: Int, completion: @escaping (Item?, Presentation?, Int) -> Void ) { + guard !items.isEmpty else { + completion(nil, nil, indexOffset) + return + } + + var remainingItems = items + let currentItem = remainingItems.removeFirst() + + loadPresentation(for: currentItem.kind) { presentation in + if let presentation { + completion(currentItem, presentation, indexOffset) + } else { + loadFirstAvailablePresentation(from: remainingItems, indexOffset: indexOffset + 1, completion: completion) + } + } + } + } + + func deferredOpenItemsMenuElement( + for sessionIdentifier: String, + showMenuForCurrentItem: Bool, + openItemPresenterProvider: @escaping () -> OpenItemsPresenter?, + completion: @escaping (_ changedCurrentItem: Bool, _ openItemsChanged: Bool) -> Void + ) -> UIDeferredMenuElement { + UIDeferredMenuElement.uncached { [weak self] elementProvider in + guard let self else { + elementProvider([]) + return + } + var elements: [UIMenuElement] = [] + let openItem: Item? = showMenuForCurrentItem ? itemsSortedByLastOpen(for: sessionIdentifier).first : nil + let existingItemsSortedByLastOpen = itemsSortedByUserOrder(for: sessionIdentifier) + let itemTuples: [(Item, RItem)] = filterValidItemsWithRItem(existingItemsSortedByLastOpen) + let itemsCount = itemTuples.count + for (index, (item, rItem)) in itemTuples.enumerated() { + if item == openItem { + var currentItemActions: [UIAction] = [] + let closeAction = UIAction(title: L10n.Accessibility.Pdf.currentItemClose, image: .init(systemName: "xmark.circle")) { [weak self] _ in + guard let self else { return } + close(item.kind, for: sessionIdentifier) + guard let presenter = openItemPresenterProvider() else { return } + restoreMostRecentlyOpenedItem(using: presenter, sessionIdentifier: sessionIdentifier) { item in + if item == nil { + DDLogInfo("OpenItemsController: no open item to restore after close") + } + completion(true, true) + } + } + currentItemActions.append(closeAction) + if index > 0 { + let moveToTopAction = UIAction(title: L10n.Accessibility.Pdf.currentItemMoveToStart, image: .init(systemName: "arrowshape.up.circle")) { [weak self] _ in + guard let self else { return } + move(item.kind, to: 0, for: sessionIdentifier) + completion(false, true) + } + currentItemActions.append(moveToTopAction) + } + if index < itemsCount - 1 { + let moveToBottomAction = UIAction(title: L10n.Accessibility.Pdf.currentItemMoveToEnd, image: .init(systemName: "arrowshape.down.circle")) { [weak self] _ in + guard let self else { return } + move(item.kind, to: itemsCount, for: sessionIdentifier) + completion(false, true) + } + currentItemActions.append(moveToBottomAction) + } + if itemsCount > 1 { + let closeOtherAction = UIAction(title: L10n.Accessibility.Pdf.closeOtherOpenItems, image: .init(systemName: "checkmark.circle.badge.xmark")) { [weak self] _ in + guard let self else { return } + set(items: [item], for: sessionIdentifier, validate: false) + completion(false, true) + } + currentItemActions.append(closeOtherAction) + } + let currentItemMenu = UIMenu(title: L10n.Accessibility.Pdf.currentItem, options: [.displayInline], children: currentItemActions) + let currentItemElement = UIMenu(title: rItem.displayTitle, image: item.kind.icon, children: [currentItemMenu]) + elements.append(currentItemElement) + } else { + let itemAction = UIAction(title: rItem.displayTitle, image: item.kind.icon) { [weak self] _ in + guard let self, let presenter = openItemPresenterProvider() else { return } + restore(item, using: presenter) { restored in + completion(restored, false) + } + } + elements.append(itemAction) + } + } + + let closeAllAction = UIAction(title: L10n.Accessibility.Pdf.closeAllOpenItems, image: .init(systemName: "xmark.square")) { [weak self] _ in + guard let self else { return } + set(items: [], for: sessionIdentifier, validate: false) + openItemPresenterProvider()?.showItem(with: nil) + completion(true, true) + } + let closeAllElement = UIMenu(options: [.displayInline], children: [closeAllAction]) + elements.append(closeAllElement) + + elementProvider(elements) + } + } + + func loadPresentation(for key: String, libraryId: LibraryIdentifier, page: Int?, preselectedAnnotationKey: String?, previewRects: [CGRect]?, completion: @escaping (Presentation?) -> Void) { + var library: Library? + var rItem: RItem? + do { + try dbStorage.perform(on: .main) { coordinator in + library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) + rItem = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) + } + } catch let error { + DDLogError("OpenItemsController: library (\(libraryId)) or item (\(key)) not found - \(error)") + } + guard let library, let rItem else { + completion(nil) + return + } + if let note = Note(item: rItem) { + completion(createNotePresentation(library: library, rItem: rItem, note: note)) + return + } + guard let attachment = AttachmentCreator.attachment(for: rItem, fileStorage: fileStorage, urlDetector: nil) else { + DDLogInfo("OpenItemsController: trying to create attachment for incorrect item type - \(rItem.rawType)") + completion(nil) + return + } + guard case .file(_, let contentType, _, _, _) = attachment.type else { + DDLogInfo("OpenItemsController: trying to open invalid attachment type - \(attachment.type)") + completion(nil) + return + } + switch contentType { + case "application/pdf": + loadPresentation( + for: .pdf(libraryId: libraryId, key: key), + library: library, + rItem: rItem, + attachment: attachment, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects, + completion: completion + ) + return + + case "text/html": + if FeatureGates.enabled.contains(.htmlEpubReader) { + loadPresentation( + for: .html(libraryId: libraryId, key: key), + library: library, + rItem: rItem, + attachment: attachment, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects, + completion: completion + ) + return + } + + case "application/epub+zip": + if FeatureGates.enabled.contains(.htmlEpubReader) { + loadPresentation( + for: .epub(libraryId: libraryId, key: key), + library: library, + rItem: rItem, + attachment: attachment, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects, + completion: completion + ) + return + } + + default: + break + } + completion(nil) + } + + // MARK: Helper Methods + private func itemsSortedByUserOrder(for sessionIdentifier: String) -> [Item] { + getItems(for: sessionIdentifier).sorted(by: { $0.userIndex < $1.userIndex }) + } + + private func itemsSortedByLastOpen(for sessionIdentifier: String) -> [Item] { + getItems(for: sessionIdentifier).sorted(by: { $0.lastOpened > $1.lastOpened }) + } + + private func filterValidItemsWithRItem(_ items: [Item]) -> [(Item, RItem)] { + var itemTuples: [(Item, RItem)] = [] + do { + try dbStorage.perform(on: .main) { coordinator in + for item in items { + switch item.kind { + case .pdf(let libraryId, let key), .html(let libraryId, let key), .epub(let libraryId, let key), .note(let libraryId, let key): + do { + let rItem = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) + itemTuples.append((item, rItem)) + } catch let itemError { + DDLogError("OpenItemsController: can't load item \(item) - \(itemError)") + } + } + } + } + } catch let error { + DDLogError("OpenItemsController: can't load multiple items - \(error)") + } + return itemTuples + } + + private func filterValidItems(_ items: [Item]) -> [Item] { + filterValidItemsWithRItem(items).map { $0.0 } + } + + private func loadPresentation(for itemKind: Item.Kind, completion: @escaping (Presentation?) -> Void) { + var library: Library? + var rItem: RItem? + do { + try dbStorage.perform(on: .main) { coordinator in + library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: itemKind.libraryId)) + rItem = try coordinator.perform(request: ReadItemDbRequest(libraryId: itemKind.libraryId, key: itemKind.key)) + } + } catch let error { + DDLogError("OpenItemsController: item kind \(itemKind) not found - \(error)") + } + guard let library, let rItem else { + completion(nil) + return + } + loadPresentation(for: itemKind, library: library, rItem: rItem, attachment: nil, page: nil, preselectedAnnotationKey: nil, previewRects: nil, completion: completion) + } + + private func loadPresentation( + for itemKind: Item.Kind, + library: Library, + rItem: RItem, + attachment: Attachment?, + page: Int?, + preselectedAnnotationKey: String?, + previewRects: [CGRect]?, + completion: @escaping (Presentation?) -> Void + ) { + switch itemKind { + case .pdf, .html, .epub: + guard let attachment = attachment ?? AttachmentCreator.attachment(for: rItem, fileStorage: fileStorage, urlDetector: nil) else { + completion(nil) + return + } + loadItemPresentation( + kind: itemKind, + library: library, + rItem: rItem, + attachment: attachment, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects, + completion: completion + ) + + case .note: + completion(createNotePresentation(library: library, rItem: rItem)) + } + + func loadItemPresentation( + kind: Item.Kind, + library: Library, + rItem: RItem, + attachment: Attachment, + page: Int?, + preselectedAnnotationKey: String?, + previewRects: [CGRect]?, + completion: @escaping (Presentation?) -> Void + ) { + let libraryId = kind.libraryId + let key = kind.key + let parentKey = rItem.parent?.key + switch attachment.type { + case .file(let filename, let contentType, let location, _, _): + switch location { + case .local: + completion(createItemPresentation( + kind: kind, + parentKey: parentKey, + library: library, + filename: filename, + contentType: contentType, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects + )) + + case .localAndChangedRemotely, .remote: + let disposeBag = DisposeBag() + attachmentDownloader.observable + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] update in + guard let self, update.libraryId == attachment.libraryId, update.key == attachment.key else { return } + switch update.kind { + case .ready: + completion(createItemPresentation( + kind: kind, + parentKey: parentKey, + library: library, + filename: filename, + contentType: contentType, + page: page, + preselectedAnnotationKey: preselectedAnnotationKey, + previewRects: previewRects + )) + downloadDisposeBag = nil + + case .cancelled, .failed: + completion(nil) + downloadDisposeBag = nil + + case .progress: + break + } + }) + .disposed(by: disposeBag) + downloadDisposeBag = disposeBag + attachmentDownloader.downloadIfNeeded(attachment: attachment, parentKey: parentKey) + + case .remoteMissing: + DDLogError("OpenItemsController: can't load item (key: \(key), library: \(libraryId)) - remote missing") + completion(nil) + } + + case .url: + DDLogError("OpenItemsController: can't load item (key: \(key), library: \(libraryId)) - not a file attachment") + completion(nil) + } + + func createItemPresentation( + kind: Item.Kind, + parentKey: String?, + library: Library, + filename: String, + contentType: String, + page: Int?, + preselectedAnnotationKey: String?, + previewRects: [CGRect]? + ) -> Presentation? { + let file = Files.attachmentFile(in: library.identifier, key: kind.key, filename: filename, contentType: contentType) + let url = file.createUrl() + switch kind { + case .pdf(_, let key): + return .pdf(library: library, key: key, parentKey: parentKey, url: url, page: page, preselectedAnnotationKey: preselectedAnnotationKey, previewRects: previewRects) + + case .html(_, let key): + return .html(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: preselectedAnnotationKey) + + case .epub(_, let key): + return .epub(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: preselectedAnnotationKey) + + case .note: + return nil + } + } + } + } + + private func createNotePresentation(library: Library, rItem: RItem, note: Note) -> Presentation? { + let parentTitleData: NoteEditorState.TitleData? = rItem.parent.flatMap { .init(type: $0.rawType, title: $0.displayTitle) } + return .note(library: library, key: note.key, text: note.text, tags: note.tags, parentTitleData: parentTitleData, title: note.title) + } + + private func createNotePresentation(library: Library, rItem: RItem) -> Presentation? { + return Note(item: rItem).flatMap { createNotePresentation(library: library, rItem: rItem, note: $0) } + } +} + +extension OpenItemsController { + func openItemsUserActivity(for sessionIdentifier: String?, libraryId: LibraryIdentifier, collectionId: CollectionIdentifier? = nil) -> NSUserActivity { + let items = sessionIdentifier.flatMap({ getItems(for: $0) }) ?? [] + return items.isEmpty ? .mainActivity(with: []) : .contentActivity(with: items, libraryId: libraryId, collectionId: collectionId ?? Defaults.shared.selectedCollectionId) + } + + func setOpenItemsUserActivity(from viewController: UIViewController, libraryId: LibraryIdentifier, collectionId: CollectionIdentifier? = nil, title: String? = nil) { + let activity = openItemsUserActivity(for: viewController.sessionIdentifier, libraryId: libraryId, collectionId: collectionId).set(title: title) + viewController.set(userActivity: activity) + } +} + +extension UIImage { + static func openItemsImage(count: Int) -> UIImage? { + let count = max(0, count) + return count <= 50 ? UIImage(systemName: "\(count).square") : UIImage(systemName: "square.grid.3x3.square") + } +} + +extension UIBarButtonItem { + static func openItemsBarButtonItem() -> UIBarButtonItem { + let barButtonItem = UIBarButtonItem(image: .openItemsImage(count: 0), style: .plain, target: nil, action: nil) + barButtonItem.isEnabled = true + barButtonItem.accessibilityLabel = L10n.Accessibility.Pdf.openItems + barButtonItem.title = L10n.Accessibility.Pdf.openItems + return barButtonItem } } diff --git a/Zotero/Extensions/NSUserActivity+Activities.swift b/Zotero/Extensions/NSUserActivity+Activities.swift index 5cd7e3260..bd7c73dd1 100644 --- a/Zotero/Extensions/NSUserActivity+Activities.swift +++ b/Zotero/Extensions/NSUserActivity+Activities.swift @@ -14,8 +14,8 @@ struct RestoredStateData { let openItems: [OpenItem] let restoreMostRecentlyOpenedItem: Bool - static func myLibrary() -> Self { - .init(libraryId: .custom(.myLibrary), collectionId: .custom(.all), openItems: [], restoreMostRecentlyOpenedItem: false) + static func myLibrary(openItems: [OpenItem] = []) -> Self { + .init(libraryId: .custom(.myLibrary), collectionId: .custom(.all), openItems: openItems, restoreMostRecentlyOpenedItem: false) } } @@ -29,9 +29,9 @@ extension NSUserActivity { private static let openItemsKey = "openItems" private static let restoreMostRecentlyOpenedItemKey = "restoreMostRecentlyOpenedItem" - static func mainActivity() -> NSUserActivity { + static func mainActivity(with openItems: [OpenItem]) -> NSUserActivity { return NSUserActivity(activityType: self.mainId) - .addUserInfoEntries(openItems: []) + .addUserInfoEntries(openItems: openItems) .addUserInfoEntries(restoreMostRecentlyOpened: false) } diff --git a/Zotero/Extensions/UIViewController+Extensions.swift b/Zotero/Extensions/UIViewController+Extensions.swift index 29cf268f9..7ba73a8cb 100644 --- a/Zotero/Extensions/UIViewController+Extensions.swift +++ b/Zotero/Extensions/UIViewController+Extensions.swift @@ -69,4 +69,8 @@ extension UIViewController { // Parent also didn't return a scene. Trying presenting view controller. return presentingViewController?.scene } + + var sessionIdentifier: String? { + scene?.session.persistentIdentifier + } } diff --git a/Zotero/Models/Predicates.swift b/Zotero/Models/Predicates.swift index 205d8da4f..21a943ccc 100644 --- a/Zotero/Models/Predicates.swift +++ b/Zotero/Models/Predicates.swift @@ -43,6 +43,10 @@ extension NSPredicate { .library(with: libraryId)]) } + static func keysByLibraryIdentifier(_ keysByLibraryIdentifier: [LibraryIdentifier: Set]) -> NSPredicate { + NSCompoundPredicate(orPredicateWithSubpredicates: keysByLibraryIdentifier.map({ .keys($0.value, in: $0.key) })) + } + static func key(notIn keys: [String], in libraryId: LibraryIdentifier) -> NSPredicate { return NSCompoundPredicate(andPredicateWithSubpredicates: [.library(with: libraryId), .key(notIn: keys)]) } diff --git a/Zotero/SceneDelegate.swift b/Zotero/SceneDelegate.swift index 7afe9e444..b52287f30 100644 --- a/Zotero/SceneDelegate.swift +++ b/Zotero/SceneDelegate.swift @@ -70,12 +70,13 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { DDLogInfo("SceneDelegate: app opened by \(URLContexts)") guard let urlContext = URLContexts.first else { return } - coordinator.showScreen(for: urlContext, animated: (UIApplication.shared.applicationState == .active)) + coordinator.showScreen(for: urlContext, animated: (UIApplication.shared.applicationState == .active), completion: nil) } func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { if shortcutItem.type == NSUserActivity.mainId { - completionHandler(coordinator.showMainScreen(with: .myLibrary(), session: windowScene.session)) + let openItems: [OpenItem] = windowScene.userActivity?.restoredStateData?.openItems ?? [] + completionHandler(coordinator.showMainScreen(with: .myLibrary(openItems: openItems), session: windowScene.session)) } completionHandler(false) } @@ -109,4 +110,8 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? { return scene.userActivity } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + coordinator.continueUserActivity(userActivity, for: scene.session.persistentIdentifier) + } } diff --git a/Zotero/Scenes/AppCoordinator.swift b/Zotero/Scenes/AppCoordinator.swift index c76713f15..be50a9363 100644 --- a/Zotero/Scenes/AppCoordinator.swift +++ b/Zotero/Scenes/AppCoordinator.swift @@ -17,9 +17,9 @@ import RxSwift protocol AppDelegateCoordinatorDelegate: AnyObject { func showMainScreen(isLoggedIn: Bool, options: UIScene.ConnectionOptions, session: UISceneSession, animated: Bool) func didRotate(to size: CGSize) - @discardableResult - func showScreen(for urlContext: UIOpenURLContext, animated: Bool) -> Bool + func showScreen(for urlContext: UIOpenURLContext, animated: Bool, completion: ((Bool) -> Void)?) func showMainScreen(with data: RestoredStateData, session: UISceneSession) -> Bool + func continueUserActivity(_ userActivity: NSUserActivity, for sessionIdentifier: String) } protocol AppOnboardingCoordinatorDelegate: AnyObject { @@ -139,7 +139,7 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { DDLogInfo("AppCoordinator: show main screen logged \(isLoggedIn ? "in" : "out"); animated=\(animated)") show(viewController: viewController, in: window, animated: animated) { - process(urlContext: urlContext, data: data) + process(urlContext: urlContext, data: data, sessionIdentifier: session.persistentIdentifier) } func show(viewController: UIViewController?, in window: UIWindow, animated: Bool = false, completion: @escaping () -> Void) { @@ -158,8 +158,9 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { var userActivity: NSUserActivity? var data: RestoredStateData? if connectionOptions.shortcutItem?.type == NSUserActivity.mainId { - userActivity = .mainActivity() - data = .myLibrary() + let openItems: [OpenItem] = session.stateRestorationActivity?.restoredStateData?.openItems ?? [] + userActivity = .mainActivity(with: openItems) + data = .myLibrary(openItems: openItems) } else { userActivity = connectionOptions.userActivities.first ?? session.stateRestorationActivity data = userActivity?.restoredStateData @@ -169,128 +170,68 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { DDLogInfo("AppCoordinator: Preprocessing restored state - \(data)") Defaults.shared.selectedLibraryId = data.libraryId Defaults.shared.selectedCollectionId = data.collectionId + controllers.userControllers?.openItemsController.set(items: data.openItems, for: session.persistentIdentifier, validate: true) } return (urlContext, data) } - func process(urlContext: UIOpenURLContext?, data: RestoredStateData?) { - if let urlContext, showScreen(for: urlContext, animated: false) { - return - } - - if let data { - DDLogInfo("AppCoordinator: Processing restored state - \(data)") - // If scene had state stored, restore state - showRestoredState(for: data) + func process(urlContext: UIOpenURLContext?, data: RestoredStateData?, sessionIdentifier: String) { + if let urlContext { + showScreen(for: urlContext, animated: false) { success in + guard !success else { return } + process(data: data, sessionIdentifier: sessionIdentifier) + } + } else { + process(data: data, sessionIdentifier: sessionIdentifier) } - func showRestoredState(for data: RestoredStateData) { - DDLogInfo("AppCoordinator: show restored state") - guard let mainController = window.rootViewController as? MainViewController else { - DDLogWarn("AppCoordinator: show restored state aborted - invalid root view controller") - return + func process(data: RestoredStateData?, sessionIdentifier: String) { + if let data { + DDLogInfo("AppCoordinator: Processing restored state - \(data)") + // If scene had state stored, restore state + showRestoredState(for: data, sessionIdentifier: sessionIdentifier) } - var collection: Collection - if let optionalCollection = loadRestoredStateData(libraryId: data.libraryId, collectionId: data.collectionId) { - DDLogInfo("AppCoordinator: show restored state using restored collection") - collection = optionalCollection - // No need to set selected collection identifier here, this happened already in show main screen / preprocess - } else { - DDLogWarn("AppCoordinator: show restored state using all items collection") - // Collection is missing, show all items instead - collection = Collection(custom: .all) - } - mainController.showItems(for: collection, in: data.libraryId) - guard data.restoreMostRecentlyOpenedItem, let item = data.openItems.first else { return } - restoreMostRecentlyOpenedItem(using: self, item: item) - - func loadRestoredStateData(libraryId: LibraryIdentifier, collectionId: CollectionIdentifier) -> Collection? { - guard let dbStorage = controllers.userControllers?.dbStorage else { return nil } - var collection: Collection? - - do { - collection = try dbStorage.perform(request: ReadCollectionDbRequest(collectionId: collectionId, libraryId: libraryId), on: .main) - } catch let error { - DDLogError("AppCoordinator: can't load restored data - \(error)") - return nil + func showRestoredState(for data: RestoredStateData, sessionIdentifier: String) { + guard let openItemsController = controllers.userControllers?.openItemsController else { return } + DDLogInfo("AppCoordinator: show restored state") + guard let mainController = window.rootViewController as? MainViewController else { + DDLogWarn("AppCoordinator: show restored state aborted - invalid root view controller") + return + } + var collection: Collection + if let optionalCollection = loadRestoredStateData(libraryId: data.libraryId, collectionId: data.collectionId) { + DDLogInfo("AppCoordinator: show restored state using restored collection") + collection = optionalCollection + // No need to set selected collection identifier here, this happened already in show main screen / preprocess + } else { + DDLogWarn("AppCoordinator: show restored state using all items collection") + // Collection is missing, show all items instead + collection = Collection(custom: .all) + } + mainController.showItems(for: collection, in: data.libraryId) + guard data.restoreMostRecentlyOpenedItem else { return } + openItemsController.restoreMostRecentlyOpenedItem(using: self, sessionIdentifier: sessionIdentifier) { item in + if let item { + DDLogInfo("AppCoordinator: restored open item - \(item)") + } else { + DDLogInfo("AppCoordinator: no open item to restore") + } } - return collection - } + func loadRestoredStateData(libraryId: LibraryIdentifier, collectionId: CollectionIdentifier) -> Collection? { + guard let dbStorage = controllers.userControllers?.dbStorage else { return nil } - func restoreMostRecentlyOpenedItem(using presenter: OpenItemsPresenter, item: OpenItem) { - guard let presentation = loadPresentation(for: item) else { return } - presenter.showItem(with: presentation) + var collection: Collection? - func loadPresentation(for item: OpenItem) -> ItemPresentation? { - guard let dbStorage = controllers.userControllers?.dbStorage else { return nil } - var presentation: ItemPresentation? do { - try dbStorage.perform(on: .main) { coordinator in - switch item.kind { - case .pdf, .html, .epub: - presentation = try loadItemPresentation(kind: item.kind, coordinator: coordinator) - - case .note(let libraryId, let key): - presentation = try loadNotePresentation(key: key, libraryId: libraryId, coordinator: coordinator) - } - } + collection = try dbStorage.perform(request: ReadCollectionDbRequest(collectionId: collectionId, libraryId: libraryId), on: .main) } catch let error { - DDLogError("OpenItemsController: can't load item \(item) - \(error)") - } - return presentation - - func loadItemPresentation(kind: OpenItem.Kind, coordinator: DbCoordinator) throws -> ItemPresentation? { - let libraryId = kind.libraryId - let key = kind.key - let library: Library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) - let rItem = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) - let parentKey = rItem.parent?.key - guard let attachment = AttachmentCreator.attachment(for: rItem, fileStorage: controllers.fileStorage, urlDetector: nil) else { return nil } - var presentation: ItemPresentation? - switch attachment.type { - case .file(let filename, let contentType, let location, _, _): - switch location { - case .local, .localAndChangedRemotely: - presentation = createItemPresentation(kind: kind, parentKey: parentKey, library: library, filename: filename, contentType: contentType) - - case .remote, .remoteMissing: - break - } - - case .url: - break - } - return presentation - - func createItemPresentation(kind: OpenItem.Kind, parentKey: String?, library: Library, filename: String, contentType: String) -> ItemPresentation? { - let file = Files.attachmentFile(in: library.identifier, key: kind.key, filename: filename, contentType: contentType) - let url = file.createUrl() - switch kind { - case .pdf(_, let key): - return .pdf(library: library, key: key, parentKey: parentKey, url: url, page: nil, preselectedAnnotationKey: nil, previewRects: nil) - - case .html(_, let key): - return .html(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: nil) - - case .epub(_, let key): - return .epub(library: library, key: key, parentKey: parentKey, url: url, preselectedAnnotationKey: nil) - - case .note: - return nil - } - } + DDLogError("AppCoordinator: can't load restored data - \(error)") + return nil } - func loadNotePresentation(key: String, libraryId: LibraryIdentifier, coordinator: DbCoordinator) throws -> ItemPresentation? { - let library = try coordinator.perform(request: ReadLibraryDbRequest(libraryId: libraryId)) - let rItem = try coordinator.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key)) - let note = Note(item: rItem) - let parentTitleData: NoteEditorState.TitleData? = rItem.parent.flatMap { .init(type: $0.rawType, title: $0.displayTitle) } - guard let note else { return nil } - return .note(library: library, key: note.key, text: note.text, tags: note.tags, parentTitleData: parentTitleData, title: note.title) - } + return collection } } } @@ -303,47 +244,51 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { debugWindow.frame = debugWindowFrame(for: size, xPos: xPos) } - @discardableResult - func showScreen(for urlContext: UIOpenURLContext, animated: Bool) -> Bool { + func showScreen(for urlContext: UIOpenURLContext, animated: Bool, completion: ((Bool) -> Void)? = nil) { let sourceApp = urlContext.options.sourceApplication ?? "unknown" DDLogInfo("AppCoordinator: show screen for \(urlContext.url.absoluteString) from \(sourceApp)") guard let window, let mainController = window.rootViewController as? MainViewController else { DDLogWarn("AppCoordinator: show screen aborted - invalid root view controller") - return false + completion?(false) + return + } + guard let urlController = controllers.userControllers?.customUrlController else { + completion?(false) + return } - guard let urlController = controllers.userControllers?.customUrlController, let kind = urlController.process(url: urlContext.url) else { return false } - - switch kind { - case .itemDetail(let key, let libraryId, let preselectedChildKey): - DDLogInfo("AppCoordinator: show screen - item detail; key=\(key); library=\(libraryId)") - showItemDetail(in: mainController, key: key, libraryId: libraryId, selectChildKey: preselectedChildKey, animated: animated, dismissIfPresenting: true) - case .itemReader(let presentation, let attachment, let isAvailable): - DDLogInfo("AppCoordinator: show screen - item reader; \(presentation)") - let key = presentation.key - let parentKey = presentation.parentKey - let libraryId = presentation.library.identifier - if isAvailable { + urlController.process(url: urlContext.url) { kind in + guard let kind else { + completion?(false) + return + } + switch kind { + case .itemDetail(let key, let libraryId, let preselectedChildKey): + DDLogInfo("AppCoordinator: show screen - item detail; key=\(key); library=\(libraryId)") + showItemDetail(in: mainController, key: key, libraryId: libraryId, selectChildKey: preselectedChildKey, animated: animated, dismissIfPresenting: true) + + case .itemReader(let presentation): + DDLogInfo("AppCoordinator: show screen - item reader; \(presentation)") + let key = presentation.key + let parentKey = presentation.parentKey + let libraryId = presentation.library.identifier mainController.getDetailCoordinator(for: nil, and: nil) { coordinator in guard (coordinator.navigationController?.presentedViewController as? ReaderViewController)?.key != key else { return } - showItem(presentation: presentation, window: window, detailCoordinator: coordinator, animated: animated) { + let show = { + coordinator.showItem(with: presentation) showItemDetail(in: mainController, key: parentKey ?? key, libraryId: libraryId, selectChildKey: key, animated: false, dismissIfPresenting: false) } - } - } else { - showItemDetail(in: mainController, key: parentKey ?? key, libraryId: libraryId, selectChildKey: key, animated: animated, dismissIfPresenting: true) { - download(attachment: attachment, parentKey: parentKey) { - mainController.getDetailCoordinator(for: nil, and: nil) { coordinator in - showItem(presentation: presentation, window: window, detailCoordinator: coordinator, animated: true) { - } - } + if animated { + show() + } else { + // When launching the app, the presentation is dispatched to the next main run loop, otherwise it fails. + DispatchQueue.main.async(execute: show) } } } + completion?(true) } - return true - func showItemDetail( in mainController: MainViewController, key: String, @@ -382,17 +327,6 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { } } - func download(attachment: Attachment, parentKey: String?, completion: @escaping () -> Void) { - guard let downloader = controllers.userControllers?.fileDownloader else { - completion() - return - } - downloader.downloadIfNeeded(attachment: attachment, parentKey: parentKey) { result in - guard case .success = result else { return } - completion() - } - } - func showItem( presentation: ItemPresentation, window: UIWindow, @@ -415,11 +349,25 @@ extension AppCoordinator: AppDelegateCoordinatorDelegate { func showMainScreen(with data: RestoredStateData, session: UISceneSession) -> Bool { guard let window, let mainController = window.rootViewController as? MainViewController else { return false } + controllers.userControllers?.openItemsController.set(items: data.openItems, for: session.persistentIdentifier, validate: true) mainController.dismiss(animated: false) { mainController.masterCoordinator?.showCollections(for: data.libraryId, preselectedCollection: data.collectionId, animated: false) } return true } + + func continueUserActivity(_ userActivity: NSUserActivity, for sessionIdentifier: String) { + guard userActivity.activityType == NSUserActivity.contentContainerId, let window, let mainController = window.rootViewController as? MainViewController else { return } + mainController.getDetailCoordinator(for: nil, and: nil) { [weak self] coordinator in + self?.controllers.userControllers?.openItemsController.restoreMostRecentlyOpenedItem(using: coordinator, sessionIdentifier: sessionIdentifier) { item in + if let item { + DDLogInfo("AppCoordinator: restored open item for continued user activity - \(item)") + } else { + DDLogInfo("AppCoordinator: no open item to restore for continued user activity") + } + } + } + } } extension AppCoordinator: MFMailComposeViewControllerDelegate { diff --git a/Zotero/Scenes/Detail/DetailCoordinator.swift b/Zotero/Scenes/Detail/DetailCoordinator.swift index 501adc0fb..a3f7aee11 100644 --- a/Zotero/Scenes/Detail/DetailCoordinator.swift +++ b/Zotero/Scenes/Detail/DetailCoordinator.swift @@ -91,10 +91,12 @@ final class DetailCoordinator: Coordinator { weak var itemsTagFilterDelegate: ItemsTagFilterDelegate? weak var navigationController: UINavigationController? private var tmpAudioDelegate: AVPlayerDelegate? + var presentedRestoredControllerWindow: UIWindow? let collection: Collection let libraryId: LibraryIdentifier let searchItemKeys: [String]? + let sessionIdentifier: String private unowned let controllers: Controllers private let disposeBag: DisposeBag @@ -105,6 +107,7 @@ final class DetailCoordinator: Coordinator { navigationController: UINavigationController, mainCoordinatorDelegate: MainCoordinatorDelegate, itemsTagFilterDelegate: ItemsTagFilterDelegate?, + sessionIdentifier: String, controllers: Controllers ) { self.libraryId = libraryId @@ -113,6 +116,7 @@ final class DetailCoordinator: Coordinator { self.navigationController = navigationController self.mainCoordinatorDelegate = mainCoordinatorDelegate self.itemsTagFilterDelegate = itemsTagFilterDelegate + self.sessionIdentifier = sessionIdentifier self.controllers = controllers self.childCoordinators = [] self.disposeBag = DisposeBag() @@ -149,7 +153,14 @@ final class DetailCoordinator: Coordinator { let searchTerm = searchItemKeys?.joined(separator: " ") let sortType = Defaults.shared.itemsSortType let downloadBatchData = ItemsState.DownloadBatchData(batchData: userControllers.fileDownloader.batchData) - let state = TrashState(libraryId: libraryId, sortType: sortType, searchTerm: searchTerm, filters: [], downloadBatchData: downloadBatchData) + let state = TrashState( + libraryId: libraryId, + sortType: sortType, + searchTerm: searchTerm, + filters: [], + downloadBatchData: downloadBatchData, + openItemsCount: userControllers.openItemsController.getItems(for: sessionIdentifier).count + ) let handler = TrashActionHandler( dbStorage: userControllers.dbStorage, schemaController: controllers.schemaController, @@ -159,7 +170,7 @@ final class DetailCoordinator: Coordinator { htmlAttributedStringConverter: controllers.htmlAttributedStringConverter, fileCleanupController: userControllers.fileCleanupController ) - let controller = TrashViewController(viewModel: ViewModel(initialState: state, handler: handler), controllers: controllers, coordinatorDelegate: self) + let controller = TrashViewController(viewModel: ViewModel(initialState: state, handler: handler), controllers: controllers, coordinatorDelegate: self, presenter: self) controller.tagFilterDelegate = itemsTagFilterDelegate itemsTagFilterDelegate?.delegate = controller return controller @@ -188,7 +199,8 @@ final class DetailCoordinator: Coordinator { downloadBatchData: downloadBatchData, remoteDownloadBatchData: remoteDownloadBatchData, identifierLookupBatchData: identifierLookupBatchData, - error: nil + error: nil, + openItemsCount: userControllers.openItemsController.getItems(for: sessionIdentifier).count ) let handler = ItemsActionHandler( dbStorage: userControllers.dbStorage, @@ -201,7 +213,7 @@ final class DetailCoordinator: Coordinator { htmlAttributedStringConverter: controllers.htmlAttributedStringConverter, recognizerController: userControllers.recognizerController ) - let controller = ItemsViewController(viewModel: ViewModel(initialState: state, handler: handler), controllers: controllers, coordinatorDelegate: self) + let controller = ItemsViewController(viewModel: ViewModel(initialState: state, handler: handler), controllers: controllers, coordinatorDelegate: self, presenter: self) controller.tagFilterDelegate = itemsTagFilterDelegate itemsTagFilterDelegate?.delegate = controller return controller @@ -228,14 +240,20 @@ final class DetailCoordinator: Coordinator { switch contentType { case "application/pdf": DDLogInfo("DetailCoordinator: show PDF \(attachment.key)") - showPdf(at: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId) + showPDF(at: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId, page: nil, preselectedAnnotationKey: nil, previewRects: nil) - case "text/html", "application/epub+zip": + case "text/html": if FeatureGates.enabled.contains(.htmlEpubReader) { - DDLogInfo("DetailCoordinator: show HTML / EPUB \(attachment.key)") - showHtmlEpubReader(for: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId, readerURL: readerURL) - } else if contentType == "text/html" { + DDLogInfo("DetailCoordinator: show HTML \(attachment.key)") + showHTML(at: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId, readerURL: readerURL) + } else { showWebView(for: url) + } + + case "application/epub+zip": + if FeatureGates.enabled.contains(.htmlEpubReader) { + DDLogInfo("DetailCoordinator: show EPUB \(attachment.key)") + showEpub(at: url, key: attachment.key, parentKey: parentKey, libraryId: libraryId, readerURL: readerURL) } else { DDLogInfo("DetailCoordinator: share attachment \(attachment.key)") share(item: file.createUrl(), sourceItem: sourceItem) @@ -335,6 +353,19 @@ final class DetailCoordinator: Coordinator { navigationController.present(controller, animated: true, completion: nil) } + private func showDetail(presentedBy presenter: UIViewController, detailControllerProvider: () -> DetailNavigationViewController) { + if let presentedViewController = presenter.presentedViewController { + if let presentedDetailNavigationController = presentedViewController as? DetailNavigationViewController { + presentedDetailNavigationController.replaceContents(with: detailControllerProvider(), animated: false) + return + } + guard let window = presentedViewController.view.window else { return } + show(viewControllerProvider: detailControllerProvider, by: presenter, in: window, animated: false) + return + } + presenter.present(detailControllerProvider(), animated: true) + } + func createPDFController( key: String, parentKey: String?, @@ -343,8 +374,8 @@ final class DetailCoordinator: Coordinator { page: Int? = nil, preselectedAnnotationKey: String? = nil, previewRects: [CGRect]? = nil - ) -> NavigationViewController { - let navigationController = NavigationViewController() + ) -> DetailNavigationViewController { + let navigationController = DetailNavigationViewController() navigationController.modalPresentationStyle = .fullScreen let coordinator = PDFCoordinator( @@ -356,8 +387,10 @@ final class DetailCoordinator: Coordinator { preselectedAnnotationKey: preselectedAnnotationKey, previewRects: previewRects, navigationController: navigationController, + sessionIdentifier: sessionIdentifier, controllers: controllers ) + navigationController.coordinator = coordinator coordinator.parentCoordinator = self childCoordinators.append(coordinator) coordinator.start(animated: false) @@ -365,9 +398,10 @@ final class DetailCoordinator: Coordinator { return navigationController } - func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, readerURL: URL?, preselectedAnnotationKey: String? = nil) -> NavigationViewController { - let navigationController = NavigationViewController() + func createHtmlEpubController(key: String, parentKey: String?, libraryId: LibraryIdentifier, url: URL, readerURL: URL?, preselectedAnnotationKey: String? = nil) -> DetailNavigationViewController { + let navigationController = DetailNavigationViewController() navigationController.modalPresentationStyle = .fullScreen + let coordinator = HtmlEpubCoordinator( key: key, parentKey: parentKey, @@ -376,22 +410,62 @@ final class DetailCoordinator: Coordinator { readerURL: readerURL, preselectedAnnotationKey: preselectedAnnotationKey, navigationController: navigationController, + sessionIdentifier: sessionIdentifier, controllers: controllers ) + navigationController.coordinator = coordinator coordinator.parentCoordinator = self - self.childCoordinators.append(coordinator) + childCoordinators.append(coordinator) coordinator.start(animated: false) + return navigationController } - private func showPdf(at url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier) { - let controller = createPDFController(key: key, parentKey: parentKey, libraryId: libraryId, url: url) - navigationController?.present(controller, animated: true, completion: nil) + private func show(_ kind: OpenItem.Kind, collectionId: CollectionIdentifier, targetSessionIdentifier: String, sourceSessionIdentifier: String, openItemsController: OpenItemsController) { + let application = UIApplication.shared + guard let itemSession = application.openSessions.first(where: { $0.persistentIdentifier == targetSessionIdentifier }) else { return } + openItemsController.open(kind, for: targetSessionIdentifier) + let userActivity = openItemsController.openItemsUserActivity(for: targetSessionIdentifier, libraryId: kind.libraryId, collectionId: collectionId) + let options = UIScene.ActivationRequestOptions() + options.requestingScene = application.connectedScenes.first(where: { $0.session.persistentIdentifier == sourceSessionIdentifier }) + let errorHandler: (any Error) -> Void = { error in + DDLogError("DetailCoordinator: failed to activate scene session: \(itemSession) - \(error)") + } + if #available(iOS 17.0, *) { + let request = UISceneSessionActivationRequest(session: itemSession, userActivity: userActivity, options: options) + application.activateSceneSession(for: request, errorHandler: errorHandler) + } else { + application.requestSceneSessionActivation(itemSession, userActivity: userActivity, options: options, errorHandler: errorHandler) + } } - private func showHtmlEpubReader(for url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL?) { - let controller = createHtmlEpubController(key: key, parentKey: parentKey, libraryId: libraryId, url: url, readerURL: readerURL) - self.navigationController?.present(controller, animated: true, completion: nil) + private func showReaderItem(kind: OpenItem.Kind, detailControllerProvider: () -> DetailNavigationViewController) { + guard let navigationController, let openItemsController = controllers.userControllers?.openItemsController else { return } + if let existingSessionIdentifier = openItemsController.sessionIdentifier(for: kind), existingSessionIdentifier != sessionIdentifier { + show(kind, collectionId: collection.id, targetSessionIdentifier: existingSessionIdentifier, sourceSessionIdentifier: sessionIdentifier, openItemsController: openItemsController) + return + } + openItemsController.open(kind, for: sessionIdentifier) + + showDetail(presentedBy: navigationController, detailControllerProvider: detailControllerProvider) + } + + private func showPDF(at url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier, page: Int?, preselectedAnnotationKey: String?, previewRects: [CGRect]?) { + showReaderItem(kind: .pdf(libraryId: libraryId, key: key)) { + self.createPDFController(key: key, parentKey: parentKey, libraryId: libraryId, url: url, page: page, preselectedAnnotationKey: preselectedAnnotationKey, previewRects: previewRects) + } + } + + private func showHTML(at url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL? = nil) { + showReaderItem(kind: .html(libraryId: libraryId, key: key)) { + self.createHtmlEpubController(key: key, parentKey: parentKey, libraryId: libraryId, url: url, readerURL: readerURL) + } + } + + private func showEpub(at url: URL, key: String, parentKey: String?, libraryId: LibraryIdentifier, readerURL: URL? = nil) { + showReaderItem(kind: .epub(libraryId: libraryId, key: key)) { + self.createHtmlEpubController(key: key, parentKey: parentKey, libraryId: libraryId, url: url, readerURL: readerURL) + } } private func showWebView(for url: URL) { @@ -480,7 +554,7 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { controller.addAction(UIAlertAction(title: L10n.Items.newNote, style: .default, handler: { [weak self, weak viewModel] _ in guard let self, let viewModel else { return } - showNote(library: viewModel.state.library, kind: .standaloneCreation(collection: viewModel.state.collection), saveCallback: nil) + showNote(library: viewModel.state.library, kind: .standaloneCreation(collection: viewModel.state.collection)) })) if viewModel.state.library.filesEditable { @@ -563,8 +637,8 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { tags: [Tag], parentTitleData: NoteEditorState.TitleData?, title: String? - ) -> NavigationViewController { - return createNoteController(library: library, kind: kind, text: text, tags: tags, parentTitleData: parentTitleData, title: title).0 + ) -> DetailNavigationViewController { + createNoteController(library: library, kind: kind, text: text, tags: tags, parentTitleData: parentTitleData, title: title).0 } private func createNoteController( @@ -574,8 +648,8 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { tags: [Tag], parentTitleData: NoteEditorState.TitleData?, title: String? - ) -> (NavigationViewController, ViewModel) { - let navigationController = NavigationViewController() + ) -> (DetailNavigationViewController, ViewModel) { + let navigationController = DetailNavigationViewController() navigationController.modalPresentationStyle = .fullScreen navigationController.isModalInPresentation = true @@ -587,8 +661,10 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate { parentTitleData: parentTitleData, title: title, navigationController: navigationController, + sessionIdentifier: sessionIdentifier, controllers: controllers ) + navigationController.coordinator = coordinator coordinator.parentCoordinator = self childCoordinators.append(coordinator) coordinator.start(animated: false) @@ -1102,27 +1178,47 @@ extension DetailCoordinator: DetailNoteEditorCoordinatorDelegate { tags: [Tag] = [], parentTitleData: NoteEditorState.TitleData? = nil, title: String? = nil, - saveCallback: ((Note) -> Void)? + saveCallback: ((Note) -> Void)? = nil ) { guard let navigationController else { return } + var creationCallback: ((Note) -> Void)? switch kind { case .itemCreation, .standaloneCreation: DDLogInfo("DetailCoordinator: show note creation") + creationCallback = { [weak self] note in + guard let self, let openItemsController = controllers.userControllers?.openItemsController else { return } + openItemsController.open(.note(libraryId: library.identifier, key: note.key), for: sessionIdentifier) + } case .edit(let key), .readOnly(let key): DDLogInfo("DetailCoordinator: show note \(key)") + guard let openItemsController = controllers.userControllers?.openItemsController else { return } + let kind: OpenItem.Kind = .note(libraryId: library.identifier, key: key) + if let existingSessionIdentifier = openItemsController.sessionIdentifier(for: kind), existingSessionIdentifier != sessionIdentifier { + show(kind, collectionId: collection.id, targetSessionIdentifier: existingSessionIdentifier, sourceSessionIdentifier: sessionIdentifier, openItemsController: openItemsController) + return + } + openItemsController.open(kind, for: sessionIdentifier) } - let (controller, viewModel) = createNoteController(library: library, kind: kind, text: text, tags: tags, parentTitleData: parentTitleData, title: title) - navigationController.present(controller, animated: true) - - if let saveCallback { - viewModel.stateObservable - .observe(on: MainScheduler.instance) - .subscribe(onNext: { state in - guard state.changes.contains(.saved), case .edit(let key) = state.kind else { return } - saveCallback(Note(key: key, text: state.text, tags: state.tags)) - }) - .disposed(by: disposeBag) + + showDetail(presentedBy: navigationController) { + let (controller, viewModel) = self.createNoteController(library: library, kind: kind, text: text, tags: tags, parentTitleData: parentTitleData, title: title) + + if saveCallback != nil || creationCallback != nil { + viewModel.stateObservable + .observe(on: MainScheduler.instance) + .subscribe(onNext: { state in + guard state.changes.contains(.saved), case .edit(let key) = state.kind else { return } + let note = Note(key: key, text: state.text, tags: state.tags) + if state.changes.contains(.kind) { + creationCallback?(note) + } + saveCallback?(note) + }) + .disposed(by: disposeBag) + } + + return controller } } } @@ -1156,6 +1252,30 @@ extension DetailCoordinator: DetailCitationCoordinatorDelegate { extension DetailCoordinator: DetailCopyBibliographyCoordinatorDelegate { } +extension DetailCoordinator: OpenItemsPresenter { + func showItem(with presentation: ItemPresentation?) { + switch presentation { + case .pdf(let library, let key, let parentKey, let url, let page, let preselectedAnnotationKey, let previewRects): + showPDF(at: url, key: key, parentKey: parentKey, libraryId: library.identifier, page: page, preselectedAnnotationKey: preselectedAnnotationKey, previewRects: previewRects) + + case .html(let library, let key, let parentKey, let url, let preselectedAnnotationKey): + showHTML(at: url, key: key, parentKey: parentKey, libraryId: library.identifier) + + case .epub(let library, let key, let parentKey, let url, let preselectedAnnotationKey): + showEpub(at: url, key: key, parentKey: parentKey, libraryId: library.identifier) + + case .note(let library, let key, let text, let tags, let parentTitleData, let title): + let kind: NoteEditorKind = library.metadataEditable ? .edit(key: key) : .readOnly(key: key) + showNote(library: library, kind: kind, text: text, tags: tags, parentTitleData: parentTitleData, title: title) + + case .none: + navigationController?.dismiss(animated: true) + } + } +} + +extension DetailCoordinator: InstantPresenter { } + // swiftlint:disable private_over_fileprivate fileprivate class AVPlayerDelegate: NSObject, AVPlayerViewControllerDelegate { private var dismissBlock: () -> Void diff --git a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift index 243e39103..54e8c98eb 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/HtmlEpubCoordinator.swift @@ -35,6 +35,7 @@ final class HtmlEpubCoordinator: ReaderCoordinator { private let url: URL private let readerURL: URL? private let preselectedAnnotationKey: String? + private let sessionIdentifier: String internal unowned let controllers: Controllers private let disposeBag: DisposeBag @@ -46,6 +47,7 @@ final class HtmlEpubCoordinator: ReaderCoordinator { readerURL: URL?, preselectedAnnotationKey: String?, navigationController: NavigationViewController, + sessionIdentifier: String, controllers: Controllers ) { self.key = key @@ -55,6 +57,7 @@ final class HtmlEpubCoordinator: ReaderCoordinator { self.readerURL = readerURL self.preselectedAnnotationKey = preselectedAnnotationKey self.navigationController = navigationController + self.sessionIdentifier = sessionIdentifier self.controllers = controllers childCoordinators = [] disposeBag = DisposeBag() @@ -74,7 +77,8 @@ final class HtmlEpubCoordinator: ReaderCoordinator { guard let dbStorage = controllers.userControllers?.dbStorage, let userId = controllers.sessionController.sessionData?.userId, !username.isEmpty, - let parentNavigationController = parentCoordinator?.navigationController + let parentNavigationController = parentCoordinator?.navigationController, + let openItemsController = controllers.userControllers?.openItemsController else { return } let settings = Defaults.shared.htmlEpubSettings @@ -97,11 +101,13 @@ final class HtmlEpubCoordinator: ReaderCoordinator { libraryId: libraryId, userId: userId, username: username, - interfaceStyle: settings.appearance == .automatic ? parentNavigationController.view.traitCollection.userInterfaceStyle : settings.appearance.userInterfaceStyle + interfaceStyle: settings.appearance == .automatic ? parentNavigationController.view.traitCollection.userInterfaceStyle : settings.appearance.userInterfaceStyle, + openItemsCount: openItemsController.getItems(for: sessionIdentifier).count ) let controller = HtmlEpubReaderViewController( viewModel: ViewModel(initialState: state, handler: handler), - compactSize: UIDevice.current.isCompactWidth(size: parentNavigationController.view.frame.size) + compactSize: UIDevice.current.isCompactWidth(size: parentNavigationController.view.frame.size), + openItemsController: openItemsController ) controller.coordinatorDelegate = self navigationController?.setViewControllers([controller], animated: false) @@ -158,3 +164,9 @@ extension HtmlEpubCoordinator: HtmlEpubReaderCoordinatorDelegate { (parentCoordinator as? DetailCoordinator)?.show(url: url) } } + +extension HtmlEpubCoordinator: OpenItemsPresenter { + func showItem(with presentation: ItemPresentation?) { + (parentCoordinator as? OpenItemsPresenter)?.showItem(with: presentation) + } +} diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderAction.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderAction.swift index 6f4828d2d..188f51e8c 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderAction.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderAction.swift @@ -42,4 +42,5 @@ enum HtmlEpubReaderAction { case toggleTool(AnnotationTool) case updateAnnotationProperties(key: String, type: AnnotationType, color: String, lineWidth: CGFloat, pageLabel: String, updateSubsequentLabels: Bool, highlightText: NSAttributedString) case userInterfaceStyleChanged(UIUserInterfaceStyle) + case updateOpenItems(items: [OpenItem]) } diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift index d695c6133..045389f6d 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Models/HtmlEpubReaderState.swift @@ -32,6 +32,7 @@ struct HtmlEpubReaderState: ViewModelState { static let outline = Changes(rawValue: 1 << 13) static let appearance = Changes(rawValue: 1 << 14) static let searchResults = Changes(rawValue: 1 << 15) + static let openItems = Changes(rawValue: 1 << 16) } struct DocumentData { @@ -147,6 +148,7 @@ struct HtmlEpubReaderState: ViewModelState { var outlines: [Outline] var outlineSearch: String var interfaceStyle: UIUserInterfaceStyle + var openItemsCount: Int var readerFile: File { readerDirectory.copy(withName: "view", ext: "html") @@ -163,7 +165,8 @@ struct HtmlEpubReaderState: ViewModelState { libraryId: LibraryIdentifier, userId: Int, username: String, - interfaceStyle: UIUserInterfaceStyle + interfaceStyle: UIUserInterfaceStyle, + openItemsCount: Int ) { self.readerURL = readerURL ?? Bundle.main.url(forResource: "reader", withExtension: nil, subdirectory: "Bundled") let originalFile = Files.file(from: url) @@ -178,6 +181,7 @@ struct HtmlEpubReaderState: ViewModelState { self.username = username self.interfaceStyle = interfaceStyle selectedAnnotationKey = preselectedAnnotationKey + self.openItemsCount = openItemsCount sortedKeys = [] annotations = [:] comments = [:] diff --git a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift index 4c71a8378..4e11d748b 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/ViewModels/HtmlEpubReaderActionHandler.swift @@ -160,6 +160,13 @@ final class HtmlEpubReaderActionHandler: ViewModelActionHandler, BackgroundDbPro case .parseOutline(let data): parse(outline: data, viewModel: viewModel) + + case .updateOpenItems(let items): + guard viewModel.state.openItemsCount != items.count else { return } + update(viewModel: viewModel) { state in + state.openItemsCount = items.count + state.changes = .openItems + } } } diff --git a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift index 3892dfd14..83922a1a6 100644 --- a/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift +++ b/Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift @@ -45,7 +45,8 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare var statusBarHeight: CGFloat var key: String { return viewModel.state.key } - weak var coordinatorDelegate: HtmlEpubReaderCoordinatorDelegate? + private unowned let openItemsController: OpenItemsController + weak var coordinatorDelegate: (HtmlEpubReaderCoordinatorDelegate & OpenItemsPresenter)? @CodableUserDefault( key: "HtmlEpubReaderToolbarState", defaultValue: AnnotationToolbarHandler.State(position: .leading, visible: true), @@ -62,6 +63,25 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare var isSidebarVisible: Bool { return self.sidebarControllerLeft?.constant == 0 } var isDocumentLocked: Bool { return false } private(set) var activeAnnotationTool: AnnotationTool? + private lazy var openItemsButton: UIBarButtonItem = { + let openItems = UIBarButtonItem.openItemsBarButtonItem() + if let sessionIdentifier { + let deferredOpenItemsMenuElement = openItemsController.deferredOpenItemsMenuElement( + for: sessionIdentifier, + showMenuForCurrentItem: true, + openItemPresenterProvider: { [weak self] in + self?.coordinatorDelegate + }, + completion: { [weak self] _, openItemsChanged in + guard let self, openItemsChanged else { return } + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) + } + ) + let openItemsMenu = UIMenu(title: L10n.Accessibility.Pdf.openItems, options: [.displayInline], children: [deferredOpenItemsMenuElement]) + openItems.menu = UIMenu(children: [openItemsMenu]) + } + return openItems + }() lazy var toolbarButton: UIBarButtonItem = { return createToolbarButton() }() @@ -92,9 +112,10 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare // MARK: - Lifecycle - init(viewModel: ViewModel, compactSize: Bool) { + init(viewModel: ViewModel, compactSize: Bool, openItemsController: OpenItemsController) { self.viewModel = viewModel isCompactWidth = compactSize + self.openItemsController = openItemsController disposeBag = DisposeBag() statusBarHeight = UIApplication .shared @@ -118,22 +139,30 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare override func viewDidLoad() { super.viewDidLoad() - setActivity() + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) viewModel.process(action: .changeIdleTimerDisabled(true)) view.backgroundColor = .systemBackground - observeViewModel() setupNavigationBar() setupViews() + setupObserving() updateInterface(to: viewModel.state.settings) - navigationItem.rightBarButtonItems = createRightBarButtonItems() - func observeViewModel() { + func setupObserving() { viewModel.stateObservable .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] state in self?.process(state: state) }) .disposed(by: disposeBag) + + if let sessionIdentifier { + openItemsController.observable(for: sessionIdentifier) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] items in + self?.viewModel.process(action: .updateOpenItems(items: items)) + }) + .disposed(by: disposeBag) + } } func setupNavigationBar() { @@ -148,6 +177,7 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare sidebarButton.rx.tap.subscribe(onNext: { [weak self] _ in self?.toggleSidebar(animated: true) }).disposed(by: disposeBag) navigationItem.leftBarButtonItems = [closeButton, sidebarButton] + navigationItem.rightBarButtonItems = createRightBarButtonItems(for: viewModel.state) } func setupViews() { @@ -209,22 +239,6 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare controller.didMove(toParent: self) } } - - func setActivity() { - let kind: OpenItem.Kind - switch viewModel.state.documentFile.ext.lowercased() { - case "epub": - kind = .epub(libraryId: viewModel.state.library.identifier, key: viewModel.state.key) - - case "html", "htm": - kind = .html(libraryId: viewModel.state.library.identifier, key: viewModel.state.key) - - default: - return - } - let openItem = OpenItem(kind: kind, userIndex: 0) - set(userActivity: .contentActivity(with: [openItem], libraryId: viewModel.state.library.identifier, collectionId: Defaults.shared.selectedCollectionId).set(title: viewModel.state.title)) - } } override func viewIsAppearing(_ animated: Bool) { @@ -296,7 +310,9 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare let hidden = !state.library.metadataEditable || !toolbarState.visible annotationToolbarHandler?.set(hidden: hidden, animated: true) (toolbarButton.customView as? CheckboxButton)?.isSelected = toolbarState.visible - navigationItem.rightBarButtonItems = createRightBarButtonItems() + } + if state.changes.contains(.library) || state.changes.contains(.openItems) { + navigationItem.rightBarButtonItems = createRightBarButtonItems(for: state) } if state.changes.contains(.popover) { @@ -406,11 +422,17 @@ class HtmlEpubReaderViewController: UIViewController, ReaderViewController, Pare navigationController?.presentingViewController?.dismiss(animated: true) } - private func createRightBarButtonItems() -> [UIBarButtonItem] { + private func createRightBarButtonItems(for state: HtmlEpubReaderState) -> [UIBarButtonItem] { var buttons = [settingsButton, searchButton] - if viewModel.state.library.metadataEditable { + if FeatureGates.enabled.contains(.multipleOpenItems) { + buttons.insert(openItemsButton, at: 1) + openItemsButton.image = .openItemsImage(count: state.openItemsCount) + } + + if state.library.metadataEditable { buttons.append(toolbarButton) } + return buttons } } diff --git a/Zotero/Scenes/Detail/Items/Models/ItemsAction.swift b/Zotero/Scenes/Detail/Items/Models/ItemsAction.swift index 3b6daf84b..e517ab7e3 100644 --- a/Zotero/Scenes/Detail/Items/Models/ItemsAction.swift +++ b/Zotero/Scenes/Detail/Items/Models/ItemsAction.swift @@ -44,4 +44,5 @@ enum ItemsAction { case attachmentOpened(String) case updateKeys(items: Results, deletions: [Int], insertions: [Int], modifications: [Int]) case applySettings + case updateOpenItems(items: [OpenItem]) } diff --git a/Zotero/Scenes/Detail/Items/Models/ItemsState.swift b/Zotero/Scenes/Detail/Items/Models/ItemsState.swift index 4bf5207b5..72163804f 100644 --- a/Zotero/Scenes/Detail/Items/Models/ItemsState.swift +++ b/Zotero/Scenes/Detail/Items/Models/ItemsState.swift @@ -24,6 +24,7 @@ struct ItemsState: ViewModelState { static let filters = Changes(rawValue: 1 << 5) static let batchData = Changes(rawValue: 1 << 6) static let library = Changes(rawValue: 1 << 7) + static let openItems = Changes(rawValue: 1 << 8) } struct DownloadBatchData: Equatable { @@ -121,6 +122,7 @@ struct ItemsState: ViewModelState { var itemTitleFont: UIFont { return UIFont.preferredFont(for: .headline, weight: .regular) } + var openItemsCount: Int init( collection: Collection, @@ -131,7 +133,8 @@ struct ItemsState: ViewModelState { downloadBatchData: DownloadBatchData?, remoteDownloadBatchData: DownloadBatchData?, identifierLookupBatchData: IdentifierLookupBatchData, - error: ItemsError? + error: ItemsError?, + openItemsCount: Int ) { self.collection = collection self.filters = [] @@ -148,6 +151,7 @@ struct ItemsState: ViewModelState { self.identifierLookupBatchData = identifierLookupBatchData self.searchTerm = searchTerm self.itemTitles = [:] + self.openItemsCount = openItemsCount switch libraryId { case .custom: diff --git a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift index e464f1f87..a4c5e7618 100644 --- a/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift +++ b/Zotero/Scenes/Detail/Items/ViewModels/ItemsActionHandler.swift @@ -185,6 +185,14 @@ final class ItemsActionHandler: BaseItemsActionHandler, ViewModelActionHandler { case .applySettings: applySettings(in: viewModel) + + case .updateOpenItems(let items): + update(viewModel: viewModel) { state in + if state.openItemsCount != items.count { + state.openItemsCount = items.count + state.changes = .openItems + } + } } } diff --git a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift index ec35cedeb..c9762e37e 100644 --- a/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/BaseItemsViewController.swift @@ -22,6 +22,7 @@ class BaseItemsViewController: UIViewController { case deselectAll case add case emptyTrash + case restoreOpenItems } private static let itemBatchingLimit = 150 @@ -34,12 +35,14 @@ class BaseItemsViewController: UIViewController { var handler: ItemsTableViewHandler? weak var tagFilterDelegate: ItemsTagFilterDelegate? weak var coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)? + weak var presenter: OpenItemsPresenter? private let debugReaderQueue: DispatchQueue? private var readerURL: URL? - init(controllers: Controllers, coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)) { + init(controllers: Controllers, coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate), presenter: OpenItemsPresenter) { self.controllers = controllers self.coordinatorDelegate = coordinatorDelegate + self.presenter = presenter disposeBag = DisposeBag() #if DEBUG debugReaderQueue = DispatchQueue(label: "org.zotero.DebugReaderQueue", qos: .userInteractive) @@ -298,7 +301,20 @@ class BaseItemsViewController: UIViewController { func tagSelectionDidChange(selected: Set) {} - func process(barButtonItemAction: RightBarButtonItem, sender: UIBarButtonItem) {} + func process(barButtonItemAction: RightBarButtonItem, sender: UIBarButtonItem) { + switch barButtonItemAction { + case .select, .done, .selectAll, .deselectAll, .add, .emptyTrash: + break + + case .restoreOpenItems: + guard let presenter, let controller = controllers.userControllers?.openItemsController, let sessionIdentifier else { return } + controller.restoreMostRecentlyOpenedItem(using: presenter, sessionIdentifier: sessionIdentifier) { item in + if item == nil { + DDLogInfo("ItemsViewController: no open item to restore") + } + } + } + } func downloadsFilterDidChange(enabled: Bool) {} @@ -326,7 +342,7 @@ class BaseItemsViewController: UIViewController { } func setupRightBarButtonItems(expectedItems: [RightBarButtonItem]) { - let currentItems = (self.navigationItem.rightBarButtonItems ?? []).compactMap({ RightBarButtonItem(rawValue: $0.tag) }) + let currentItems = (navigationItem.rightBarButtonItems ?? []).compactMap({ RightBarButtonItem(rawValue: $0.tag) }) guard currentItems != expectedItems else { return } self.navigationItem.rightBarButtonItems = expectedItems.compactMap({ createRightBarButtonItem($0) }).reversed() @@ -334,6 +350,7 @@ class BaseItemsViewController: UIViewController { var image: UIImage? var title: String? let accessibilityLabel: String + var menu: UIMenu? switch type { case .deselectAll: @@ -360,13 +377,34 @@ class BaseItemsViewController: UIViewController { case .emptyTrash: title = L10n.Collections.emptyTrash accessibilityLabel = L10n.Collections.emptyTrash + + case .restoreOpenItems: + image = .openItemsImage(count: 0) + accessibilityLabel = L10n.Items.restoreOpen + if let controller = controllers.userControllers?.openItemsController, let sessionIdentifier { + let deferredOpenItemsMenuElement = controller.deferredOpenItemsMenuElement( + for: sessionIdentifier, + showMenuForCurrentItem: false, + openItemPresenterProvider: { [weak self] in + self?.presenter + }, + completion: { [weak self] _, openItemsChanged in + guard let self, openItemsChanged else { return } + set(userActivity: .mainActivity(with: controllers.userControllers?.openItemsController.getItems(for: sessionIdentifier) ?? []) + .set(title: coordinatorDelegate?.displayTitle) + ) + } + ) + let openItemsMenu = UIMenu(title: L10n.Accessibility.Pdf.openItems, options: [.displayInline], children: [deferredOpenItemsMenuElement]) + menu = UIMenu(children: [openItemsMenu]) + } } let primaryAction = UIAction { [weak self] action in guard let self, let sender = action.sender as? UIBarButtonItem else { return } process(barButtonItemAction: type, sender: sender) } - let item = UIBarButtonItem(title: title, image: image, primaryAction: primaryAction) + let item = UIBarButtonItem(title: title, image: image, primaryAction: primaryAction, menu: menu) item.tag = type.rawValue item.accessibilityLabel = accessibilityLabel return item diff --git a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift index 49bf6cb3b..70f18ed24 100644 --- a/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift +++ b/Zotero/Scenes/Detail/Items/Views/ItemsViewController.swift @@ -31,9 +31,14 @@ final class ItemsViewController: BaseItemsViewController { return toolbarData(from: viewModel.state) } - init(viewModel: ViewModel, controllers: Controllers, coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)) { + init( + viewModel: ViewModel, + controllers: Controllers, + coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate), + presenter: OpenItemsPresenter + ) { self.viewModel = viewModel - super.init(controllers: controllers, coordinatorDelegate: coordinatorDelegate) + super.init(controllers: controllers, coordinatorDelegate: coordinatorDelegate, presenter: presenter) viewModel.process(action: .loadInitialState) } @@ -62,6 +67,7 @@ final class ItemsViewController: BaseItemsViewController { setupRecognizerObserver() setupAppStateObserver() setupSettingsObserver() + setupOpenItemsObserving() if let term = viewModel.state.searchTerm, !term.isEmpty { navigationItem.searchController?.searchBar.text = term @@ -165,6 +171,16 @@ final class ItemsViewController: BaseItemsViewController { }) .disposed(by: disposeBag) } + + func setupOpenItemsObserving() { + guard let controller = controllers.userControllers?.openItemsController, let sessionIdentifier else { return } + controller.observable(for: sessionIdentifier) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] items in + self?.viewModel.process(action: .updateOpenItems(items: items)) + }) + .disposed(by: disposeBag) + } } deinit { @@ -211,6 +227,10 @@ final class ItemsViewController: BaseItemsViewController { if state.changes.contains(.filters) || state.changes.contains(.batchData) { toolbarController?.reloadToolbarItems(for: toolbarData(from: state)) } + + if state.changes.contains(.openItems) { + setupRightBarButtonItems(expectedItems: rightBarButtonItemTypes(for: state)) + } if let key = state.itemKeyToDuplicate { coordinatorDelegate?.showItemDetail( @@ -362,6 +382,9 @@ final class ItemsViewController: BaseItemsViewController { case .select: viewModel.process(action: .startEditing) + + case .restoreOpenItems: + super.process(barButtonItemAction: barButtonItemAction, sender: sender) } } @@ -423,9 +446,27 @@ final class ItemsViewController: BaseItemsViewController { ) } + override func setupRightBarButtonItems(expectedItems: [RightBarButtonItem]) { + defer { + updateRestoreOpenItemsButton(withCount: viewModel.state.openItemsCount) + } + super.setupRightBarButtonItems(expectedItems: expectedItems) + + func updateRestoreOpenItemsButton(withCount count: Int) { + guard let item = navigationItem.rightBarButtonItems?.first(where: { button in RightBarButtonItem(rawValue: button.tag) == .restoreOpenItems }) else { return } + item.image = .openItemsImage(count: count) + } + } + private func rightBarButtonItemTypes(for state: ItemsState) -> [RightBarButtonItem] { - let selectItems = rightBarButtonSelectItemTypes(for: state) - return state.library.metadataEditable ? [.add] + selectItems : selectItems + var items = rightBarButtonSelectItemTypes(for: state) + if state.library.metadataEditable { + items = [.add] + items + } + if FeatureGates.enabled.contains(.multipleOpenItems), state.openItemsCount > 0 { + items = [.restoreOpenItems] + items + } + return items func rightBarButtonSelectItemTypes(for state: ItemsState) -> [RightBarButtonItem] { if !state.isEditing { diff --git a/Zotero/Scenes/Detail/PDF/Models/PDFReaderAction.swift b/Zotero/Scenes/Detail/PDF/Models/PDFReaderAction.swift index 6629f7e40..58ddfefbc 100644 --- a/Zotero/Scenes/Detail/PDF/Models/PDFReaderAction.swift +++ b/Zotero/Scenes/Detail/PDF/Models/PDFReaderAction.swift @@ -60,4 +60,5 @@ enum PDFReaderAction { case changeFilter(AnnotationsFilter?) case submitPendingPage(Int) case unlock(String) + case updateOpenItems(items: [OpenItem]) } diff --git a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift index 695d0c7f8..4066125ad 100644 --- a/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift +++ b/Zotero/Scenes/Detail/PDF/Models/PDFReaderState.swift @@ -52,6 +52,7 @@ struct PDFReaderState: ViewModelState { static let library = Changes(rawValue: 1 << 15) static let md5 = Changes(rawValue: 1 << 16) static let appearance = Changes(rawValue: 1 << 17) + static let openItems = Changes(rawValue: 1 << 18) } enum Error: ReaderError { @@ -187,6 +188,8 @@ struct PDFReaderState: ViewModelState { var previewRects: [CGRect]? var unlockSuccessful: Bool? + var openItemsCount: Int + init( url: URL, key: String, @@ -199,7 +202,9 @@ struct PDFReaderState: ViewModelState { settings: PDFSettings, userId: Int, username: String, - interfaceStyle: UIUserInterfaceStyle + displayName: String, + interfaceStyle: UIUserInterfaceStyle, + openItemsCount: Int ) { self.key = key self.parentKey = parentKey @@ -237,6 +242,7 @@ struct PDFReaderState: ViewModelState { self.activeFontSize = CGFloat(Defaults.shared.activeFontSize) self.deletionEnabled = false self.mergingEnabled = false + self.openItemsCount = openItemsCount self.previewCache.totalCostLimit = 1024 * 1024 * 10 // Cache object limit - 10 MB diff --git a/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift b/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift index 8f3e6023d..63fcdfb03 100644 --- a/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift +++ b/Zotero/Scenes/Detail/PDF/PDFCoordinator.swift @@ -56,6 +56,7 @@ final class PDFCoordinator: ReaderCoordinator { private let page: Int? private let preselectedAnnotationKey: String? private let previewRects: [CGRect]? + private let sessionIdentifier: String internal unowned let controllers: Controllers private let disposeBag: DisposeBag @@ -68,6 +69,7 @@ final class PDFCoordinator: ReaderCoordinator { preselectedAnnotationKey: String?, previewRects: [CGRect]?, navigationController: NavigationViewController, + sessionIdentifier: String, controllers: Controllers ) { self.key = key @@ -78,6 +80,7 @@ final class PDFCoordinator: ReaderCoordinator { self.preselectedAnnotationKey = preselectedAnnotationKey self.previewRects = previewRects self.navigationController = navigationController + self.sessionIdentifier = sessionIdentifier self.controllers = controllers self.childCoordinators = [] self.disposeBag = DisposeBag() @@ -97,7 +100,8 @@ final class PDFCoordinator: ReaderCoordinator { guard let userControllers = controllers.userControllers, let userId = controllers.sessionController.sessionData?.userId, !username.isEmpty, - let parentNavigationController = parentCoordinator?.navigationController + let parentNavigationController = parentCoordinator?.navigationController, + let openItemsController = controllers.userControllers?.openItemsController else { return } let settings = Defaults.shared.pdfSettings @@ -130,12 +134,15 @@ final class PDFCoordinator: ReaderCoordinator { settings: settings, userId: userId, username: username, - interfaceStyle: settings.appearanceMode == .automatic ? parentNavigationController.view.traitCollection.userInterfaceStyle : settings.appearanceMode.userInterfaceStyle + displayName: displayName, + interfaceStyle: settings.appearanceMode == .automatic ? parentNavigationController.view.traitCollection.userInterfaceStyle : settings.appearanceMode.userInterfaceStyle, + openItemsCount: openItemsController.getItems(for: sessionIdentifier).count ) let controller = PDFReaderViewController( viewModel: ViewModel(initialState: state, handler: handler), pdfWorkerController: userControllers.pdfWorkerController, - compactSize: UIDevice.current.isCompactWidth(size: parentNavigationController.view.frame.size) + compactSize: UIDevice.current.isCompactWidth(size: parentNavigationController.view.frame.size), + openItemsController: openItemsController ) controller.coordinatorDelegate = self handler.delegate = controller @@ -435,3 +442,9 @@ extension PDFCoordinator: DetailCitationCoordinatorDelegate { } extension PDFCoordinator: DetailCopyBibliographyCoordinatorDelegate { } + +extension PDFCoordinator: OpenItemsPresenter { + func showItem(with presentation: ItemPresentation?) { + (parentCoordinator as? OpenItemsPresenter)?.showItem(with: presentation) + } +} diff --git a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift index 7f5bae976..cc01d0225 100644 --- a/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift +++ b/Zotero/Scenes/Detail/PDF/ViewModels/PDFReaderActionHandler.swift @@ -267,6 +267,13 @@ final class PDFReaderActionHandler: ViewModelActionHandler, BackgroundDbProcessi update(viewModel: viewModel) { state in state.unlockSuccessful = result } + + case .updateOpenItems(let items): + guard viewModel.state.openItemsCount != items.count else { return } + update(viewModel: viewModel) { state in + state.openItemsCount = items.count + state.changes = .openItems + } } } diff --git a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift index fa26df441..bf37a5db9 100644 --- a/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift +++ b/Zotero/Scenes/Detail/PDF/Views/PDFReaderViewController.swift @@ -68,7 +68,8 @@ class PDFReaderViewController: UIViewController, ReaderViewController { var isDocumentLocked: Bool { return viewModel.state.document.isLocked } var key: String { return viewModel.state.key } - weak var coordinatorDelegate: (PdfReaderCoordinatorDelegate & PdfAnnotationsCoordinatorDelegate)? + private unowned let openItemsController: OpenItemsController + weak var coordinatorDelegate: (PdfReaderCoordinatorDelegate & PdfAnnotationsCoordinatorDelegate & OpenItemsPresenter)? private lazy var shareButton: UIBarButtonItem = { let share = UIBarButtonItem(image: UIImage(systemName: "square.and.arrow.up"), style: .plain, target: nil, action: nil) @@ -116,6 +117,29 @@ class PDFReaderViewController: UIViewController, ReaderViewController { share.menu = UIMenu(children: [deferredMenu]) return share }() + private lazy var openItemsButton: UIBarButtonItem = { + let openItems = UIBarButtonItem.openItemsBarButtonItem() + if let sessionIdentifier { + let deferredOpenItemsMenuElement = openItemsController.deferredOpenItemsMenuElement( + for: sessionIdentifier, + showMenuForCurrentItem: true, + openItemPresenterProvider: { [weak self] in + self?.coordinatorDelegate + }, + completion: { [weak self] changedCurrentItem, openItemsChanged in + guard let self else { return } + if changedCurrentItem { + close(dismiss: false) + } else if openItemsChanged { + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) + } + } + ) + let openItemsMenu = UIMenu(title: L10n.Accessibility.Pdf.openItems, options: [.displayInline], children: [deferredOpenItemsMenuElement]) + openItems.menu = UIMenu(children: [openItemsMenu]) + } + return openItems + }() private lazy var settingsButton: UIBarButtonItem = { let settings = UIBarButtonItem(image: UIImage(systemName: "gearshape"), style: .plain, target: nil, action: nil) settings.isEnabled = !viewModel.state.document.isLocked @@ -186,10 +210,11 @@ class PDFReaderViewController: UIViewController, ReaderViewController { return false } - init(viewModel: ViewModel, pdfWorkerController: PDFWorkerController, compactSize: Bool) { + init(viewModel: ViewModel, pdfWorkerController: PDFWorkerController, compactSize: Bool, openItemsController: OpenItemsController) { self.viewModel = viewModel self.pdfWorkerController = pdfWorkerController isCompactWidth = compactSize + self.openItemsController = openItemsController disposeBag = DisposeBag() super.init(nibName: nil, bundle: nil) } @@ -201,10 +226,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { override func viewDidLoad() { super.viewDidLoad() - let openItem = OpenItem(kind: .pdf(libraryId: viewModel.state.library.identifier, key: viewModel.state.key), userIndex: 0) - set(userActivity: .contentActivity(with: [openItem], libraryId: viewModel.state.library.identifier, collectionId: Defaults.shared.selectedCollectionId) - .set(title: viewModel.state.title) - ) + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) viewModel.process(action: .changeIdleTimerDisabled(true)) view.backgroundColor = .systemGray6 setupViews() @@ -332,7 +354,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { let closeButton = UIBarButtonItem(image: UIImage(systemName: "chevron.left"), style: .plain, target: nil, action: nil) closeButton.title = L10n.close closeButton.accessibilityLabel = L10n.close - closeButton.rx.tap.subscribe(onNext: { [weak self] _ in self?.close() }).disposed(by: disposeBag) + closeButton.rx.tap.subscribe(onNext: { [weak self] _ in self?.close(dismiss: true) }).disposed(by: disposeBag) let accessibilityButton: UIBarButtonItem if FeatureGates.enabled.contains(.speech), let accessibilityHandler { @@ -350,7 +372,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { .disposed(by: disposeBag) } navigationItem.leftBarButtonItems = [closeButton, sidebarButton, accessibilityButton] - navigationItem.rightBarButtonItems = createRightBarButtonItems() + navigationItem.rightBarButtonItems = createRightBarButtonItems(for: viewModel.state) } func setupObserving() { @@ -361,6 +383,15 @@ class PDFReaderViewController: UIViewController, ReaderViewController { }) .disposed(by: disposeBag) + if let sessionIdentifier { + openItemsController.observable(for: sessionIdentifier) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] items in + self?.viewModel.process(action: .updateOpenItems(items: items)) + }) + .disposed(by: disposeBag) + } + NotificationCenter.default.rx .notification(UIApplication.didBecomeActiveNotification) .observe(on: MainScheduler.instance) @@ -461,7 +492,7 @@ class PDFReaderViewController: UIViewController, ReaderViewController { private func update(state: PDFReaderState) { if state.changes.contains(.md5) { coordinatorDelegate?.showDocumentChangedAlert { [weak self] in - self?.close() + self?.close(dismiss: true) } return } @@ -509,7 +540,9 @@ class PDFReaderViewController: UIViewController, ReaderViewController { } annotationToolbarHandler?.set(hidden: hidden, animated: true) (toolbarButton.customView as? CheckboxButton)?.isSelected = toolbarState.visible - navigationItem.rightBarButtonItems = createRightBarButtonItems() + } + if state.changes.contains(.library) || state.changes.contains(.openItems) { + navigationItem.rightBarButtonItems = createRightBarButtonItems(for: state) } if let tool = state.changedColorForTool, documentController?.pdfController?.annotationStateManager.state == tool, let color = state.toolColors[tool] { @@ -644,11 +677,12 @@ class PDFReaderViewController: UIViewController, ReaderViewController { .disposed(by: disposeBag) } - private func close() { + private func close(dismiss: Bool) { if let page = documentController?.pdfController?.pageIndex { viewModel.process(action: .submitPendingPage(Int(page))) } viewModel.process(action: .clearTmpData) + guard dismiss else { return } navigationController?.presentingViewController?.dismiss(animated: true, completion: nil) } @@ -694,10 +728,19 @@ class PDFReaderViewController: UIViewController, ReaderViewController { // MARK: - Setups - private func createRightBarButtonItems() -> [UIBarButtonItem] { + internal func setupAccessibility(forSidebarButton button: UIBarButtonItem) { + button.accessibilityLabel = isSidebarVisible ? L10n.Accessibility.Pdf.sidebarClose : L10n.Accessibility.Pdf.sidebarOpen + button.title = isSidebarVisible ? L10n.Accessibility.Pdf.sidebarClose : L10n.Accessibility.Pdf.sidebarOpen + } + + private func createRightBarButtonItems(for state: PDFReaderState) -> [UIBarButtonItem] { var buttons = [settingsButton, shareButton, searchButton] + if FeatureGates.enabled.contains(.multipleOpenItems) { + buttons.insert(openItemsButton, at: 1) + openItemsButton.image = .openItemsImage(count: state.openItemsCount) + } - if viewModel.state.library.metadataEditable { + if state.library.metadataEditable { buttons.append(toolbarButton) } diff --git a/Zotero/Scenes/Detail/Trash/Models/TrashAction.swift b/Zotero/Scenes/Detail/Trash/Models/TrashAction.swift index 1a0aa3cb4..6e824ce1a 100644 --- a/Zotero/Scenes/Detail/Trash/Models/TrashAction.swift +++ b/Zotero/Scenes/Detail/Trash/Models/TrashAction.swift @@ -30,4 +30,5 @@ enum TrashAction { case toggleSelectionState case updateAttachments(AttachmentFileDeletedNotification) case updateDownload(update: AttachmentDownloader.Update, batchData: ItemsState.DownloadBatchData?) + case updateOpenItems(items: [OpenItem]) } diff --git a/Zotero/Scenes/Detail/Trash/Models/TrashState.swift b/Zotero/Scenes/Detail/Trash/Models/TrashState.swift index b66da8e9b..9bed63c56 100644 --- a/Zotero/Scenes/Detail/Trash/Models/TrashState.swift +++ b/Zotero/Scenes/Detail/Trash/Models/TrashState.swift @@ -73,6 +73,7 @@ struct TrashState: ViewModelState { static let batchData = Changes(rawValue: 1 << 5) static let attachmentsRemoved = Changes(rawValue: 1 << 6) static let library = Changes(rawValue: 1 << 7) + static let openItems = Changes(rawValue: 1 << 8) } enum Error: Swift.Error { @@ -97,8 +98,9 @@ struct TrashState: ViewModelState { var titleFont: UIFont { return UIFont.preferredFont(for: .headline, weight: .regular) } + var openItemsCount: Int - init(libraryId: LibraryIdentifier, sortType: ItemsSortType, searchTerm: String?, filters: [ItemsFilter], downloadBatchData: ItemsState.DownloadBatchData?) { + init(libraryId: LibraryIdentifier, sortType: ItemsSortType, searchTerm: String?, filters: [ItemsFilter], downloadBatchData: ItemsState.DownloadBatchData?, openItemsCount: Int) { snapshot = .empty itemDataCache = [:] self.sortType = sortType @@ -108,6 +110,7 @@ struct TrashState: ViewModelState { changes = [] selectedItems = [] self.downloadBatchData = downloadBatchData + self.openItemsCount = openItemsCount switch libraryId { case .custom: diff --git a/Zotero/Scenes/Detail/Trash/ViewModels/TrashActionHandler.swift b/Zotero/Scenes/Detail/Trash/ViewModels/TrashActionHandler.swift index 473b8678f..228ccef37 100644 --- a/Zotero/Scenes/Detail/Trash/ViewModels/TrashActionHandler.swift +++ b/Zotero/Scenes/Detail/Trash/ViewModels/TrashActionHandler.swift @@ -142,6 +142,14 @@ final class TrashActionHandler: BaseItemsActionHandler, ViewModelActionHandler { case .cacheItemDataIfNeeded(let key): cacheItemData(key: key, viewModel: viewModel) + + case .updateOpenItems(let items): + update(viewModel: viewModel) { state in + if state.openItemsCount != items.count { + state.openItemsCount = items.count + state.changes = .openItems + } + } } } diff --git a/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift b/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift index 57478c83a..a531569db 100644 --- a/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift +++ b/Zotero/Scenes/Detail/Trash/Views/TrashViewController.swift @@ -24,9 +24,14 @@ final class TrashViewController: BaseItemsViewController { return toolbarData(from: viewModel.state) } - init(viewModel: ViewModel, controllers: Controllers, coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate)) { + init( + viewModel: ViewModel, + controllers: Controllers, + coordinatorDelegate: (DetailItemsCoordinatorDelegate & DetailNoteEditorCoordinatorDelegate), + presenter: OpenItemsPresenter + ) { self.viewModel = viewModel - super.init(controllers: controllers, coordinatorDelegate: coordinatorDelegate) + super.init(controllers: controllers, coordinatorDelegate: coordinatorDelegate, presenter: presenter) viewModel.process(action: .loadData) } @@ -47,6 +52,7 @@ final class TrashViewController: BaseItemsViewController { toolbarController = ItemsToolbarController(viewController: self, data: toolbarData, collection: collection, library: library, delegate: self) setupRightBarButtonItems(expectedItems: rightBarButtonItemTypes(for: viewModel.state)) setupDownloadObserver() + setupOpenItemsObserving() dataSource.apply(snapshot: viewModel.state.snapshot) updateTagFilter(filters: viewModel.state.filters, collectionId: .custom(.trash), libraryId: viewModel.state.library.identifier) @@ -89,6 +95,16 @@ final class TrashViewController: BaseItemsViewController { }) .disposed(by: disposeBag) } + + func setupOpenItemsObserving() { + guard let controller = controllers.userControllers?.openItemsController, let sessionIdentifier else { return } + controller.observable(for: sessionIdentifier) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] items in + self?.viewModel.process(action: .updateOpenItems(items: items)) + }) + .disposed(by: disposeBag) + } } // MARK: - Actions @@ -126,6 +142,10 @@ final class TrashViewController: BaseItemsViewController { toolbarController?.reloadToolbarItems(for: toolbarData(from: state)) } + if state.changes.contains(.openItems) { + setupRightBarButtonItems(expectedItems: rightBarButtonItemTypes(for: state)) + } + if let error = state.error { process(error: error, state: state) } @@ -213,6 +233,9 @@ final class TrashViewController: BaseItemsViewController { case .select: viewModel.process(action: .startEditing) + + case .restoreOpenItems: + super.process(barButtonItemAction: barButtonItemAction, sender: sender) } } @@ -230,9 +253,24 @@ final class TrashViewController: BaseItemsViewController { ) } + override func setupRightBarButtonItems(expectedItems: [RightBarButtonItem]) { + defer { + updateRestoreOpenItemsButton(withCount: viewModel.state.openItemsCount) + } + super.setupRightBarButtonItems(expectedItems: expectedItems) + + func updateRestoreOpenItemsButton(withCount count: Int) { + guard let item = navigationItem.rightBarButtonItems?.first(where: { button in RightBarButtonItem(rawValue: button.tag) == .restoreOpenItems }) else { return } + item.image = .openItemsImage(count: count) + } + } + private func rightBarButtonItemTypes(for state: TrashState) -> [RightBarButtonItem] { - let selectItems = rightBarButtonSelectItemTypes(for: state) - return selectItems + [.emptyTrash] + var items = rightBarButtonSelectItemTypes(for: state) + [.emptyTrash] + if FeatureGates.enabled.contains(.multipleOpenItems), state.openItemsCount > 0 { + items = [.restoreOpenItems] + items + } + return items func rightBarButtonSelectItemTypes(for state: TrashState) -> [RightBarButtonItem] { if !state.isEditing { diff --git a/Zotero/Scenes/General/Models/NoteEditorAction.swift b/Zotero/Scenes/General/Models/NoteEditorAction.swift index 7858715d9..9257b0537 100644 --- a/Zotero/Scenes/General/Models/NoteEditorAction.swift +++ b/Zotero/Scenes/General/Models/NoteEditorAction.swift @@ -16,4 +16,5 @@ enum NoteEditorAction { case saveBeforeClosing case setTags([Tag]) case setText(String) + case updateOpenItems(items: [OpenItem]) } diff --git a/Zotero/Scenes/General/Models/NoteEditorState.swift b/Zotero/Scenes/General/Models/NoteEditorState.swift index 96bd18dd4..afa04ab5c 100644 --- a/Zotero/Scenes/General/Models/NoteEditorState.swift +++ b/Zotero/Scenes/General/Models/NoteEditorState.swift @@ -45,6 +45,7 @@ struct NoteEditorState: ViewModelState { static let tags = Changes(rawValue: 1 << 0) static let shouldSave = Changes(rawValue: 1 << 1) + static let openItems = Changes(rawValue: 1 << 2) static let kind = Changes(rawValue: 1 << 3) static let title = Changes(rawValue: 1 << 4) static let saved = Changes(rawValue: 1 << 5) @@ -70,16 +71,18 @@ struct NoteEditorState: ViewModelState { var downloadedResource: Resource? var createdImages: [CreatedImage] var changes: Changes + var openItemsCount: Int var title: String? var isClosing: Bool var error: Swift.Error? - init(kind: Kind, library: Library, parentTitleData: TitleData?, text: String, tags: [Tag], title: String?) { + init(kind: Kind, library: Library, parentTitleData: TitleData?, text: String, tags: [Tag], openItemsCount: Int, title: String?) { self.kind = kind self.text = text self.tags = tags self.library = library self.parentTitleData = parentTitleData + self.openItemsCount = openItemsCount self.title = title isClosing = false changes = [] diff --git a/Zotero/Scenes/General/NoteEditorCoordinator.swift b/Zotero/Scenes/General/NoteEditorCoordinator.swift index 59206cec1..dfe10bdfb 100644 --- a/Zotero/Scenes/General/NoteEditorCoordinator.swift +++ b/Zotero/Scenes/General/NoteEditorCoordinator.swift @@ -15,9 +15,9 @@ protocol NoteEditorCoordinatorDelegate: AnyObject { func show(url: URL) func showTagPicker(libraryId: LibraryIdentifier, selected: Set, picked: @escaping ([Tag]) -> Void) func show(error: Error, isClosing: Bool) - func showPdf(withPreview preview: AnnotationPreview) - func showPdf(withCitation citation: CitationMetadata) - func showItemDetail(withCitation citation: CitationMetadata) + func showItem(withPreview preview: AnnotationPreview, completion: @escaping (Bool) -> Void) + func showItem(withCitation citation: CitationMetadata, completion: @escaping (Bool) -> Void) + func showItemDetail(withCitation citation: CitationMetadata, completion: @escaping (Bool) -> Void) } final class NoteEditorCoordinator: NSObject, Coordinator { @@ -32,6 +32,7 @@ final class NoteEditorCoordinator: NSObject, Coordinator { private let parentTitleData: NoteEditorState.TitleData? private let title: String? private let library: Library + private let sessionIdentifier: String private unowned let controllers: Controllers var viewModel: ViewModel? { @@ -46,6 +47,7 @@ final class NoteEditorCoordinator: NSObject, Coordinator { parentTitleData: NoteEditorState.TitleData?, title: String?, navigationController: NavigationViewController, + sessionIdentifier: String, controllers: Controllers ) { self.kind = kind @@ -55,6 +57,7 @@ final class NoteEditorCoordinator: NSObject, Coordinator { self.title = title self.library = library self.navigationController = navigationController + self.sessionIdentifier = sessionIdentifier self.controllers = controllers childCoordinators = [] @@ -71,21 +74,29 @@ final class NoteEditorCoordinator: NSObject, Coordinator { } func start(animated: Bool) { - guard let dbStorage = controllers.userControllers?.dbStorage, let fileDownloader = controllers.userControllers?.fileDownloader else { return } - let state = NoteEditorState(kind: kind, library: library, parentTitleData: parentTitleData, text: initialText, tags: initialTags, title: title) - let handler = NoteEditorActionHandler( - dbStorage: dbStorage, - fileStorage: controllers.fileStorage, - schemaController: controllers.schemaController, - attachmentDownloader: fileDownloader + guard let dbStorage = controllers.userControllers?.dbStorage, + let fileDownloader = controllers.userControllers?.fileDownloader, + let openItemsController = controllers.userControllers?.openItemsController + else { return } + + let state = NoteEditorState( + kind: kind, + library: library, + parentTitleData: parentTitleData, + text: initialText, + tags: initialTags, + openItemsCount: openItemsController.getItems(for: sessionIdentifier).count, + title: title ) + let handler = NoteEditorActionHandler(dbStorage: dbStorage, fileStorage: controllers.fileStorage, schemaController: controllers.schemaController, attachmentDownloader: fileDownloader) let viewModel = ViewModel(initialState: state, handler: handler) let controller = NoteEditorViewController( viewModel: viewModel, htmlAttributedStringConverter: controllers.htmlAttributedStringConverter, dbStorage: dbStorage, fileStorage: controllers.fileStorage, - uriConverter: controllers.uriConverter + uriConverter: controllers.uriConverter, + openItemsController: openItemsController ) controller.coordinatorDelegate = self navigationController?.setViewControllers([controller], animated: animated) @@ -122,40 +133,49 @@ extension NoteEditorCoordinator: NoteEditorCoordinatorDelegate { navigationController?.present(controller, animated: true) } - func showPdf(withPreview preview: AnnotationPreview) { - showPdf(key: preview.parentKey, libraryId: preview.libraryId, page: preview.pageIndex, rects: preview.rects) + func showItem(withPreview preview: AnnotationPreview, completion: @escaping (Bool) -> Void) { + showItem(key: preview.parentKey, libraryId: preview.libraryId, page: preview.pageIndex, rects: preview.rects, completion: completion) } - func showPdf(withCitation citation: CitationMetadata) { - showPdf(key: citation.attachmentKey, libraryId: citation.libraryId, page: citation.locator, rects: nil) + func showItem(withCitation citation: CitationMetadata, completion: @escaping (Bool) -> Void) { + showItem(key: citation.attachmentKey, libraryId: citation.libraryId, page: citation.locator, rects: nil, completion: completion) } - func showItemDetail(withCitation citation: CitationMetadata) { - guard let coordinator = (parentCoordinator as? DetailCoordinator) else { return } + func showItemDetail(withCitation citation: CitationMetadata, completion: @escaping (Bool) -> Void) { + guard let coordinator = (parentCoordinator as? DetailCoordinator) else { + completion(false) + return + } coordinator.showItemDetail(for: .preview(key: citation.parentKey), libraryId: citation.libraryId, scrolledToKey: nil, animated: false) - navigationController?.dismiss(animated: true) + navigationController?.dismiss(animated: true) { + completion(true) + } } - private func showPdf(key: String, libraryId: LibraryIdentifier, page: Int, rects: [CGRect]?) { - guard - let coordinator = (parentCoordinator as? DetailCoordinator), - let userControllers = controllers.userControllers, - let item = try? userControllers.dbStorage.perform(request: ReadItemDbRequest(libraryId: libraryId, key: key), on: .main), - let attachment = AttachmentCreator.attachment(for: item, fileStorage: controllers.fileStorage, urlDetector: nil), - let file = attachment.file - else { return } - - userControllers.fileDownloader.downloadIfNeeded(attachment: attachment, parentKey: item.parent?.key) { [weak self, weak coordinator] result in - guard let self, let coordinator else { return } - - switch result { - case .success: - let controller = coordinator.createPDFController(key: key, parentKey: item.parent?.key, libraryId: libraryId, url: file.createUrl(), page: page, previewRects: rects) - navigationController?.present(controller, animated: true) - - case .failure(let error): - DDLogError("NoteEditorCoordinator: could not download attachment - \(error)") + private func showItem(key: String, libraryId: LibraryIdentifier, page: Int, rects: [CGRect]?, completion: @escaping (Bool) -> Void) { + guard let openItemsController = controllers.userControllers?.openItemsController else { + completion(false) + return + } + openItemsController.loadPresentation( + for: key, + libraryId: libraryId, + page: page, + preselectedAnnotationKey: nil, + previewRects: rects + ) { [weak self] presentation in + guard let presentation, let self, let coordinator = parentCoordinator as? DetailCoordinator else { + completion(false) + return } + coordinator.showItem(with: presentation) + completion(true) } } } + +extension NoteEditorCoordinator: OpenItemsPresenter { + func showItem(with presentation: ItemPresentation?) { + (parentCoordinator as? OpenItemsPresenter)?.showItem(with: presentation) + } +} diff --git a/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift b/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift index d64867440..4a97e7f0d 100644 --- a/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift +++ b/Zotero/Scenes/General/ViewModels/NoteEditorActionHandler.swift @@ -67,6 +67,13 @@ struct NoteEditorActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc guard let viewModel else { return } importImages(data: data, in: viewModel) } + + case .updateOpenItems(let items): + guard viewModel.state.openItemsCount != items.count else { return } + update(viewModel: viewModel) { state in + state.openItemsCount = items.count + state.changes = .openItems + } } } diff --git a/Zotero/Scenes/General/Views/NavigationViewController.swift b/Zotero/Scenes/General/Views/NavigationViewController.swift index 43aeb21d4..de164f285 100644 --- a/Zotero/Scenes/General/Views/NavigationViewController.swift +++ b/Zotero/Scenes/General/Views/NavigationViewController.swift @@ -20,3 +20,25 @@ class NavigationViewController: UINavigationController { dismissHandler?() } } + +class DetailNavigationViewController: NavigationViewController { + weak var coordinator: Coordinator? + public func replaceContents(with replacement: DetailNavigationViewController, animated: Bool) { + // Set replacement properties to self. + // Swap coordinators and dismiss handlers, so that the original coordinator is properly deinitialized, along with the original view controllers. + // Swap also the navigation controller property of the two coordinators. + // Store original + let originalCoordinator = coordinator + let originalDismissHandler = dismissHandler + // Swap replacement to original + coordinator = replacement.coordinator + coordinator?.navigationController = self + dismissHandler = replacement.dismissHandler + statusBarVisible = replacement.statusBarVisible + setViewControllers(replacement.viewControllers, animated: animated) + // Swap original to replacement + replacement.coordinator = originalCoordinator + replacement.coordinator?.navigationController = replacement + replacement.dismissHandler = originalDismissHandler + } +} diff --git a/Zotero/Scenes/General/Views/NoteEditorViewController.swift b/Zotero/Scenes/General/Views/NoteEditorViewController.swift index 58e555036..f8be4c4e6 100644 --- a/Zotero/Scenes/General/Views/NoteEditorViewController.swift +++ b/Zotero/Scenes/General/Views/NoteEditorViewController.swift @@ -18,6 +18,11 @@ final class NoteEditorViewController: UIViewController { case messageHandler case logHandler } + private enum RightBarButtonItem: Int { + case done + case closing + case restoreOpenItems + } @IBOutlet private weak var webView: WKWebView! @IBOutlet private weak var webViewBottom: NSLayoutConstraint! @@ -33,20 +38,23 @@ final class NoteEditorViewController: UIViewController { private let disposeBag: DisposeBag private var debounceDisposeBag: DisposeBag? - weak var coordinatorDelegate: NoteEditorCoordinatorDelegate? + private unowned let openItemsController: OpenItemsController + weak var coordinatorDelegate: (NoteEditorCoordinatorDelegate & OpenItemsPresenter)? init( viewModel: ViewModel, htmlAttributedStringConverter: HtmlAttributedStringConverter, dbStorage: DbStorage, fileStorage: FileStorage, - uriConverter: ZoteroURIConverter + uriConverter: ZoteroURIConverter, + openItemsController: OpenItemsController ) { self.viewModel = viewModel self.htmlAttributedStringConverter = htmlAttributedStringConverter self.dbStorage = dbStorage self.fileStorage = fileStorage self.uriConverter = uriConverter + self.openItemsController = openItemsController disposeBag = DisposeBag() super.init(nibName: "NoteEditorViewController", bundle: nil) } @@ -58,24 +66,16 @@ final class NoteEditorViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - switch viewModel.state.kind { - case .edit(let key), .readOnly(let key): - let openItem = OpenItem(kind: .note(libraryId: viewModel.state.library.identifier, key: key), userIndex: 0) - set(userActivity: .contentActivity(with: [openItem], libraryId: viewModel.state.library.identifier, collectionId: Defaults.shared.selectedCollectionId) - .set(title: viewModel.state.title) - ) - - case.itemCreation, .standaloneCreation: - break - } + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) if let parentTitleData = viewModel.state.parentTitleData { navigationItem.titleView = NoteEditorTitleView(type: parentTitleData.type, title: htmlAttributedStringConverter.convert(text: parentTitleData.title).string) } - setupNavbarItems(isClosing: false) + setupNavbarItems(for: viewModel.state, isClosing: false) setupKeyboard() setupWebView() + setupOpenItemsObserving() update(tags: viewModel.state.tags) viewModel.stateObservable @@ -99,6 +99,16 @@ final class NoteEditorViewController: UIViewController { webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) } + func setupOpenItemsObserving() { + guard let sessionIdentifier else { return } + openItemsController.observable(for: sessionIdentifier) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] items in + self?.viewModel.process(action: .updateOpenItems(items: items)) + }) + .disposed(by: disposeBag) + } + func setupKeyboard() { NotificationCenter.default .keyboardWillShow @@ -134,33 +144,73 @@ final class NoteEditorViewController: UIViewController { // MARK: - Actions - private func setupNavbarItems(isClosing: Bool) { - if isClosing { - let activityIndicator = UIActivityIndicatorView(style: .medium) - activityIndicator.color = .gray - activityIndicator.startAnimating() - navigationItem.rightBarButtonItem = UIBarButtonItem(customView: activityIndicator) - return + private func setupNavbarItems(for state: NoteEditorState, isClosing: Bool) { + defer { + updateRestoreOpenItemsButton(withCount: state.openItemsCount) + } + let currentItems = (self.navigationItem.rightBarButtonItems ?? []).compactMap({ RightBarButtonItem(rawValue: $0.tag) }) + let expectedItems = rightBarButtonItemTypes(for: state, isClosing: isClosing) + guard currentItems != expectedItems else { return } + navigationItem.rightBarButtonItems = expectedItems.map({ createRightBarButtonItem($0) }).reversed() + + func rightBarButtonItemTypes(for state: NoteEditorState, isClosing: Bool) -> [RightBarButtonItem] { + var items: [RightBarButtonItem] = [isClosing ? .closing : .done] + if FeatureGates.enabled.contains(.multipleOpenItems), state.openItemsCount > 0 { + items = [.restoreOpenItems] + items + } + return items } - let done = UIBarButtonItem(title: L10n.done, style: .done, target: nil, action: nil) - done.rx - .tap - .subscribe(onNext: { [weak self] _ in - guard let self else { return } - closeAndSaveIfNeeded(controller: self) - }) - .disposed(by: disposeBag) - navigationItem.rightBarButtonItem = done - - func closeAndSaveIfNeeded(controller: NoteEditorViewController) { - if controller.debounceDisposeBag == nil { - controller.close() - return + func createRightBarButtonItem(_ type: RightBarButtonItem) -> UIBarButtonItem { + let item: UIBarButtonItem + switch type { + case .done: + let done = UIBarButtonItem(title: L10n.done, style: .done, target: nil, action: nil) + done.rx.tap + .subscribe(onNext: { [weak self] _ in + guard let self else { return } + closeAndSaveIfNeeded() + }) + .disposed(by: disposeBag) + item = done + + case .closing: + let activityIndicator = UIActivityIndicatorView(style: .medium) + activityIndicator.color = .gray + activityIndicator.startAnimating() + item = UIBarButtonItem(customView: activityIndicator) + + case .restoreOpenItems: + let openItems = UIBarButtonItem.openItemsBarButtonItem() + if let sessionIdentifier { + let deferredOpenItemsMenuElement = openItemsController.deferredOpenItemsMenuElement( + for: sessionIdentifier, + showMenuForCurrentItem: true, + openItemPresenterProvider: { [weak self] in + self?.coordinatorDelegate + }, + completion: { [weak self] changedCurrentItem, openItemsChanged in + guard let self else { return } + if changedCurrentItem { + closeAndSaveIfNeeded() + } else if openItemsChanged { + openItemsController.setOpenItemsUserActivity(from: self, libraryId: viewModel.state.library.identifier, title: viewModel.state.title) + } + } + ) + let openItemsMenu = UIMenu(title: L10n.Accessibility.Pdf.openItems, options: [.displayInline], children: [deferredOpenItemsMenuElement]) + openItems.menu = UIMenu(children: [openItemsMenu]) + } + item = openItems } - controller.debounceDisposeBag = nil - controller.viewModel.process(action: .saveBeforeClosing) + item.tag = type.rawValue + return item + } + + func updateRestoreOpenItemsButton(withCount count: Int) { + guard let item = navigationItem.rightBarButtonItems?.first(where: { button in RightBarButtonItem(rawValue: button.tag) == .restoreOpenItems }) else { return } + item.image = .openItemsImage(count: count) } } @@ -181,21 +231,19 @@ final class NoteEditorViewController: UIViewController { if state.changes.contains(.shouldSave) { debounceSave() } + if state.changes.contains(.kind) || state.changes.contains(.title) { switch state.kind { - case .edit(let key), .readOnly(let key): - let openItem = OpenItem(kind: .note(libraryId: state.library.identifier, key: key), userIndex: 0) - set(userActivity: .contentActivity(with: [openItem], libraryId: state.library.identifier, collectionId: Defaults.shared.selectedCollectionId) - .set(title: state.title) - ) + case .edit, .readOnly: + openItemsController.setOpenItemsUserActivity(from: self, libraryId: state.library.identifier, title: state.title) case.itemCreation, .standaloneCreation: break } } - if state.changes.contains(.closing) { - setupNavbarItems(isClosing: state.isClosing) + if state.changes.contains(.openItems) || state.changes.contains(.closing) { + setupNavbarItems(for: state, isClosing: state.isClosing) } if !state.createdImages.isEmpty { @@ -280,15 +328,15 @@ final class NoteEditorViewController: UIViewController { return CGRect(x: doubles[0], y: doubles[1], width: doubles[2] - doubles[0], height: doubles[3] - doubles[1]) }) let preview = AnnotationPreview(parentKey: key, libraryId: libraryId, pageIndex: pageIndex, rects: rects) - coordinatorDelegate?.showPdf(withPreview: preview) + coordinatorDelegate?.showItem(withPreview: preview, completion: createCloseCompletion()) case "openCitationPage": guard let citation = data["citation"] as? [String: Any], let metadata = parseCitation(from: citation) else { return } - coordinatorDelegate?.showPdf(withCitation: metadata) + coordinatorDelegate?.showItem(withCitation: metadata, completion: createCloseCompletion()) case "showCitationItem": guard let citation = data["citation"] as? [String: Any], let metadata = parseCitation(from: citation) else { return } - coordinatorDelegate?.showItemDetail(withCitation: metadata) + coordinatorDelegate?.showItemDetail(withCitation: metadata, completion: createCloseCompletion()) default: DDLogWarn("NoteEditorViewController JS: unknown action \(action); \(data)") @@ -307,6 +355,14 @@ final class NoteEditorViewController: UIViewController { else { return nil } return CitationMetadata(attachmentKey: attachment.key, parentKey: key, libraryId: libraryId, locator: locator) } + + func createCloseCompletion() -> ((Bool) -> Void) { + return { [weak self] closed in + guard closed, let self, debounceDisposeBag != nil else { return } + debounceDisposeBag = nil + viewModel.process(action: .save) + } + } } private func update(tags: [Tag]) { @@ -340,6 +396,16 @@ final class NoteEditorViewController: UIViewController { self?.viewModel.process(action: .setTags(tags)) }) } + + private func closeAndSaveIfNeeded() { + if debounceDisposeBag == nil { + close() + return + } + + debounceDisposeBag = nil + viewModel.process(action: .saveBeforeClosing) + } } extension NoteEditorViewController: WKScriptMessageHandler { diff --git a/Zotero/Scenes/Main/Views/MainViewController.swift b/Zotero/Scenes/Main/Views/MainViewController.swift index 1cc65710c..e58154b20 100644 --- a/Zotero/Scenes/Main/Views/MainViewController.swift +++ b/Zotero/Scenes/Main/Views/MainViewController.swift @@ -34,7 +34,11 @@ final class MainViewController: UISplitViewController { private var detailCoordinator: DetailCoordinator? { didSet { guard let detailCoordinator else { return } - set(userActivity: .mainActivity().set(title: detailCoordinator.displayTitle)) + var openItems: [OpenItem] = [] + if let openItemsController = controllers.userControllers?.openItemsController, let sessionIdentifier { + openItems = openItemsController.getItems(for: sessionIdentifier) + } + set(userActivity: .mainActivity(with: openItems).set(title: detailCoordinator.displayTitle)) if let detailCoordinatorGetter, detailCoordinatorGetter.libraryId == nil || detailCoordinatorGetter.libraryId == detailCoordinator.libraryId, detailCoordinatorGetter.collectionId == nil || detailCoordinatorGetter.collectionId == detailCoordinator.collection.identifier { @@ -107,7 +111,15 @@ final class MainViewController: UISplitViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard let detailCoordinator else { return } - set(userActivity: .mainActivity().set(title: detailCoordinator.displayTitle)) + var openItems: [OpenItem] = [] + if let openItemsController = controllers.userControllers?.openItemsController, let sessionIdentifier { + if FeatureGates.enabled.contains(.multipleOpenItems) { + openItems = openItemsController.getItems(for: sessionIdentifier) + } else { + openItemsController.set(items: [], for: sessionIdentifier, validate: false) + } + } + set(userActivity: .mainActivity(with: openItems).set(title: detailCoordinator.displayTitle)) } func getDetailCoordinator(for libraryId: LibraryIdentifier?, and collectionId: CollectionIdentifier?, completion: @escaping (DetailCoordinator) -> Void) { @@ -119,6 +131,7 @@ final class MainViewController: UISplitViewController { } private func showItems(for collection: Collection, in libraryId: LibraryIdentifier, searchItemKeys: [String]?) { + guard let sessionIdentifier else { return } let navigationController = UINavigationController() let tagFilterController = (viewControllers.first as? MasterContainerViewController)?.bottomController as? ItemsTagFilterDelegate @@ -129,6 +142,7 @@ final class MainViewController: UISplitViewController { navigationController: navigationController, mainCoordinatorDelegate: self, itemsTagFilterDelegate: tagFilterController, + sessionIdentifier: sessionIdentifier, controllers: controllers ) newDetailCoordinator.start(animated: false) From 79482a91fe7d99885c1a5815dcbaf5264a584683 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Wed, 14 Jan 2026 15:12:25 +0200 Subject: [PATCH 74/75] Improve OpenItemsController download dispose bag handling --- Zotero/Controllers/OpenItemsController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Zotero/Controllers/OpenItemsController.swift b/Zotero/Controllers/OpenItemsController.swift index 09e24a962..dfba82823 100644 --- a/Zotero/Controllers/OpenItemsController.swift +++ b/Zotero/Controllers/OpenItemsController.swift @@ -185,7 +185,7 @@ final class OpenItemsController { private var itemsTokenBySessionIdentifier: [String: NotificationToken] = [:] private var observableBySessionIdentifier: [String: PublishSubject<[Item]>] = [:] private let disposeBag: DisposeBag - private var downloadDisposeBag: DisposeBag? + private var downloadDisposeBagsByAttachmentKey: [String: DisposeBag] = [:] // MARK: Object Lifecycle init(dbStorage: DbStorage, fileStorage: FileStorage, attachmentDownloader: AttachmentDownloader) { @@ -649,6 +649,7 @@ final class OpenItemsController { case .localAndChangedRemotely, .remote: let disposeBag = DisposeBag() + downloadDisposeBagsByAttachmentKey[attachment.key] = disposeBag attachmentDownloader.observable .observe(on: MainScheduler.instance) .subscribe(onNext: { [weak self] update in @@ -665,18 +666,17 @@ final class OpenItemsController { preselectedAnnotationKey: preselectedAnnotationKey, previewRects: previewRects )) - downloadDisposeBag = nil + downloadDisposeBagsByAttachmentKey[attachment.key] = nil case .cancelled, .failed: completion(nil) - downloadDisposeBag = nil + downloadDisposeBagsByAttachmentKey[attachment.key] = nil case .progress: break } }) .disposed(by: disposeBag) - downloadDisposeBag = disposeBag attachmentDownloader.downloadIfNeeded(attachment: attachment, parentKey: parentKey) case .remoteMissing: From 1367bfb4668c1cf19ac2f2385d5758b8b350dc98 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 20 Jan 2026 15:38:10 +0200 Subject: [PATCH 75/75] Add in current open item menu other item notes and attachments sub-menu --- Zotero/Assets/en.lproj/Localizable.strings | 2 + Zotero/Controllers/OpenItemsController.swift | 84 +++++++++++++++++--- 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/Zotero/Assets/en.lproj/Localizable.strings b/Zotero/Assets/en.lproj/Localizable.strings index 76f811046..61fe30d80 100644 --- a/Zotero/Assets/en.lproj/Localizable.strings +++ b/Zotero/Assets/en.lproj/Localizable.strings @@ -593,6 +593,8 @@ "accessibility.pdf.toggle_annotation_toolbar" = "Toggle annotation toolbar"; "accessibility.pdf.show_more_tools" = "Show more"; "accessibility.pdf.open_items" = "Open Items"; +"accessibility.pdf.item_notes" = "Item Notes"; +"accessibility.pdf.item_attachments" = "Item Attachments"; "accessibility.pdf.current_item" = "Current Item"; "accessibility.pdf.current_item_close" = "Close"; "accessibility.pdf.current_item_move_to_start" = "Move to start"; diff --git a/Zotero/Controllers/OpenItemsController.swift b/Zotero/Controllers/OpenItemsController.swift index dfba82823..702ee38a9 100644 --- a/Zotero/Controllers/OpenItemsController.swift +++ b/Zotero/Controllers/OpenItemsController.swift @@ -322,8 +322,8 @@ final class OpenItemsController { setItemsSortedByUserIndex(existingItems, for: sessionIdentifier, validate: false) } - func restore(_ item: Item, using presenter: OpenItemsPresenter, completion: @escaping (Bool) -> Void) { - loadPresentation(for: item.kind) { [weak presenter] presentation in + func restore(_ kind: Item.Kind, using presenter: OpenItemsPresenter, completion: @escaping (Bool) -> Void) { + loadPresentation(for: kind) { [weak presenter] presentation in guard let presenter, let presentation else { completion(false) return @@ -380,7 +380,7 @@ final class OpenItemsController { openItemPresenterProvider: @escaping () -> OpenItemsPresenter?, completion: @escaping (_ changedCurrentItem: Bool, _ openItemsChanged: Bool) -> Void ) -> UIDeferredMenuElement { - UIDeferredMenuElement.uncached { [weak self] elementProvider in + return UIDeferredMenuElement.uncached { [weak self] elementProvider in guard let self else { elementProvider([]) return @@ -392,7 +392,7 @@ final class OpenItemsController { let itemsCount = itemTuples.count for (index, (item, rItem)) in itemTuples.enumerated() { if item == openItem { - var currentItemActions: [UIAction] = [] + var currentItemActions: [UIMenuElement] = [] let closeAction = UIAction(title: L10n.Accessibility.Pdf.currentItemClose, image: .init(systemName: "xmark.circle")) { [weak self] _ in guard let self else { return } close(item.kind, for: sessionIdentifier) @@ -429,17 +429,17 @@ final class OpenItemsController { } currentItemActions.append(closeOtherAction) } + if let siblingNotesMenu = siblingNotesMenu(rItem: rItem) { + currentItemActions.append(siblingNotesMenu) + } + if let siblingAttachmentsMenu = siblingAttachmentsMenu(rItem: rItem) { + currentItemActions.append(siblingAttachmentsMenu) + } let currentItemMenu = UIMenu(title: L10n.Accessibility.Pdf.currentItem, options: [.displayInline], children: currentItemActions) let currentItemElement = UIMenu(title: rItem.displayTitle, image: item.kind.icon, children: [currentItemMenu]) elements.append(currentItemElement) } else { - let itemAction = UIAction(title: rItem.displayTitle, image: item.kind.icon) { [weak self] _ in - guard let self, let presenter = openItemPresenterProvider() else { return } - restore(item, using: presenter) { restored in - completion(restored, false) - } - } - elements.append(itemAction) + elements.append(createKindAction(title: rItem.displayTitle, kind: item.kind, openItemsChanged: false)) } } @@ -454,6 +454,68 @@ final class OpenItemsController { elementProvider(elements) } + + func siblingNotesMenu(rItem: RItem) -> UIMenu? { + guard let parent = rItem.parent else { return nil } + let notes = Array(parent.children.filter(.items(type: ItemTypes.note, notSyncState: .dirty, trash: false)).sorted(byKeyPath: "displayTitle")) + let actions: [UIAction] = notes.compactMap({ + guard $0.key != rItem.key else { return nil } + let kind = Item.Kind.note(libraryId: $0.libraryIdentifier, key: $0.key) + return createKindAction(title: $0.displayTitle, kind: kind, openItemsChanged: true) + }) + guard !actions.isEmpty else { return nil } + return UIMenu(title: L10n.Accessibility.Pdf.itemNotes, children: actions) + } + + func siblingAttachmentsMenu(rItem: RItem) -> UIMenu? { + guard let parent = rItem.parent else { return nil } + let attachments: [Attachment] = Array( + parent.children.filter(.items(type: ItemTypes.attachment, notSyncState: .dirty, trash: false)) + .sorted(byKeyPath: "displayTitle") + .compactMap({ [weak fileStorage] in + guard let fileStorage else { return nil } + return AttachmentCreator.attachment(for: $0, fileStorage: fileStorage, urlDetector: nil) + }) + ) + let titleAndKindTuples: [(String, Item.Kind)] = attachments.compactMap({ + guard $0.key != rItem.key else { return nil } + let kind: Item.Kind + switch $0.type { + case .file(_, let contentType, _, _, _): + switch contentType { + case "application/pdf": + kind = .pdf(libraryId: $0.libraryId, key: $0.key) + + case "text/html": + guard FeatureGates.enabled.contains(.htmlEpubReader) else { return nil } + kind = .html(libraryId: $0.libraryId, key: $0.key) + + case "application/epub+zip": + guard FeatureGates.enabled.contains(.htmlEpubReader) else { return nil } + kind = .epub(libraryId: $0.libraryId, key: $0.key) + + default: + return nil + } + + case .url: + return nil + } + return ($0.title, kind) + }) + let actions = titleAndKindTuples.map({ createKindAction(title: $0.0, kind: $0.1, openItemsChanged: true) }) + guard !actions.isEmpty else { return nil } + return UIMenu(title: L10n.Accessibility.Pdf.itemAttachments, children: actions) + } + + func createKindAction(title: String, kind: Item.Kind, openItemsChanged: Bool) -> UIAction { + return UIAction(title: title, image: kind.icon) { [weak self] _ in + guard let self, let presenter = openItemPresenterProvider() else { return } + restore(kind, using: presenter) { restored in + completion(restored, openItemsChanged) + } + } + } } func loadPresentation(for key: String, libraryId: LibraryIdentifier, page: Int?, preselectedAnnotationKey: String?, previewRects: [CGRect]?, completion: @escaping (Presentation?) -> Void) {