diff --git a/.buildkite/commands/verify-xcframework-test-fails-with-missing-resources.sh b/.buildkite/commands/verify-xcframework-test-fails-with-missing-resources.sh new file mode 100755 index 00000000..9fd64a36 --- /dev/null +++ b/.buildkite/commands/verify-xcframework-test-fails-with-missing-resources.sh @@ -0,0 +1,29 @@ +#!/bin/bash -eu + +set -o pipefail + +echo "--- :pencil2: Breaking bundle resource path to verify test catches failures" +# Replace "Gutenberg" with "folder_that_does_not_exist" in the HTMLPreviewManager to trigger `assert`. +# (`assert` works because we build the XCFramework with -Onone in these tests) +sed -i.bak 's/forResource: "Gutenberg", withExtension: nil/forResource: "folder_that_does_not_exist", withExtension: nil/g' ios/Sources/GutenbergKit/Sources/Views/HTMLPreview/HTMLPreviewManager.swift + +echo "--- :package: Rebuilding XCFramework with broken resource path" +make build-xcframework-debug + +echo "--- :apple: Running integration tests (expecting failure)" +set +e # Don't exit on error +make test-xcframework-integration MAKECMDGOALS=test-xcframework-integration +TEST_EXIT_CODE=$? +set -e # Re-enable exit on error + +echo "--- :mag: Restoring original file" +mv ios/Sources/GutenbergKit/Sources/Views/HTMLPreview/HTMLPreviewManager.swift.bak ios/Sources/GutenbergKit/Sources/Views/HTMLPreview/HTMLPreviewManager.swift + +echo "--- :white_check_mark: Verifying test failed as expected" +if [ $TEST_EXIT_CODE -eq 0 ]; then + echo "ERROR: Tests passed when they should have failed! The test does not properly catch missing bundle resources." + exit 1 +else + echo "SUCCESS: Tests failed as expected when bundle resources were missing (exit code: $TEST_EXIT_CODE)" + exit 0 +fi diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 0a5065dd..1c9bf91f 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -37,3 +37,17 @@ steps: - label: ':swift: Test Swift Package' command: make test-swift-package plugins: *plugins + + - label: ':xcode: Test XCFramework' + command: make test-xcframework-integration + plugins: *plugins + + - label: ':xcode: Verify XCFramework Integration Test Fails With Missing Resources' + command: .buildkite/commands/verify-xcframework-test-fails-with-missing-resources.sh + plugins: *plugins + + - label: ':swift: Build XCFramework' + command: make build-xcframework + artifact_paths: + - build/GutenbergKit.xcframework.zip + plugins: *plugins diff --git a/.gitignore b/.gitignore index 152f1095..e9bb7fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -190,8 +190,8 @@ local.properties /android/Gutenberg/src/main/assets/index.html # Disabled removing these files until this is published like Android in CI. -# /ios/Sources/GutenbergKit/Gutenberg/assets -# /ios/Sources/GutenbergKit/Gutenberg/index.html +/ios/Sources/GutenbergKit/Gutenberg/assets +/ios/Sources/GutenbergKit/Gutenberg/index.html # Translation files src/translations/ diff --git a/.xcode-version b/.xcode-version index c99f8f9a..124b7a2c 100644 --- a/.xcode-version +++ b/.xcode-version @@ -1 +1 @@ -26.0 \ No newline at end of file +26.1.1 diff --git a/Makefile b/Makefile index 7882bbef..27e29fcb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .DEFAULT_GOAL := help -SIMULATOR_DESTINATION := OS=26.0,name=iPhone 17 +SIMULATOR_DESTINATION := OS=26.1,name=iPhone 17 .PHONY: help help: ## Display this help menu @@ -148,6 +148,29 @@ test-android: ## Run Android tests @echo "--- :android: Running Android Tests" ./android/gradlew -p ./android :gutenberg:test +.PHONY: build-xcframework +build-xcframework: build ## Build XCFramework for iOS + @echo "--- :package: Building XCFramework" + @SWIFT_OPTIMIZATION_LEVEL="${SWIFT_OPTIMIZATION_LEVEL:--O}" ./build_xcframework.sh GutenbergKit + @echo "+++ :swift: XCFramework checksum" + @swift package compute-checksum ./build/GutenbergKit.xcframework.zip + +.PHONY: build-xcframework-debug +build-xcframework-debug: build ## Build XCFramework for iOS with no optimizations (for testing) + @echo "--- :package: Building XCFramework (Debug - No Optimizations)" + @SWIFT_OPTIMIZATION_LEVEL=-Onone ./build_xcframework.sh GutenbergKit + +.PHONY: test-xcframework-integration +test-xcframework-integration: build-xcframework-debug ## Run XCFramework integration tests + @echo "--- :apple: Running XCFramework Integration Tests" + @set -o pipefail && \ + xcodebuild test \ + -project ios/Demo-iOS/Gutenberg.xcodeproj \ + -scheme XCFrameworkIntegrationTests \ + -sdk iphonesimulator \ + -destination '${SIMULATOR_DESTINATION}' \ + | xcbeautify + ################################################################################ # Release Target ################################################################################ diff --git a/Package.swift b/Package.swift index 39214b9a..45f98ecc 100644 --- a/Package.swift +++ b/Package.swift @@ -7,28 +7,47 @@ let package = Package( name: "GutenbergKit", platforms: [.iOS(.v17), .macOS(.v14)], products: [ - .library(name: "GutenbergKit", targets: ["GutenbergKit"]) + .library( + name: "GutenbergKit", + // Seems like to build for XCFrameworks, we need dynamic libraries + // https://forums.swift.org/t/how-to-build-swift-package-as-xcframework/41414/57 + // + // TODO: Use env var to switch between static by default and dynamic opt-in + // + // Disabled to test binary target + // type: .dynamic, + targets: ["GutenbergKit"] + ) ], dependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.7.5"), .package(url: "https://github.com/exyte/SVGView.git", from: "1.0.6"), ], targets: [ - .target( + // Hardcoded binary target to test distribution in a client. + // + .binaryTarget( name: "GutenbergKit", - dependencies: ["SwiftSoup", "SVGView"], - path: "ios/Sources/GutenbergKit", - exclude: [], - resources: [.copy("Gutenberg")] - ), - .testTarget( - name: "GutenbergKitTests", - dependencies: ["GutenbergKit"], - path: "ios/Tests", - exclude: [], - resources: [ - .copy("GutenbergKitTests/Resources/manifest-test-case-1.json") - ] - ), + url: "https://cdn.a8c-ci.services/gutenberg-kit/xcframework/a4374acb25d8f31bc17e9664294ba392c6fb03cd51d39cc4681ba48694afccda/GutenbergKit.xcframework.zip", + checksum: "a4374acb25d8f31bc17e9664294ba392c6fb03cd51d39cc4681ba48694afccda" + ) + // Temporarily disabled just so we can try the binary distribution in a client. + // + // .target( + // name: "GutenbergKit", + // dependencies: ["SwiftSoup", "SVGView"], + // path: "ios/Sources/GutenbergKit", + // exclude: [], + // resources: [.copy("Gutenberg")] + // ), + // .testTarget( + // name: "GutenbergKitTests", + // dependencies: ["GutenbergKit"], + // path: "ios/Tests", + // exclude: [], + // resources: [ + // .copy("GutenbergKitTests/Resources/manifest-test-case-1.json") + // ] + // ), ] ) diff --git a/build_xcframework.sh b/build_xcframework.sh new file mode 100755 index 00000000..24fac214 --- /dev/null +++ b/build_xcframework.sh @@ -0,0 +1,141 @@ +#!/bin/bash -eu + +set -o pipefail + +# Originally sourced from: +# https://github.com/OpenSwiftUIProject/ProtobufKit/blob/937eae5426277bec040c7f99bc8e1498c30ed467/Scripts/build_xcframework.sh +# +# Found it via: +# https://forums.swift.org/t/how-on-earth-can-i-create-a-framework-from-a-swift-package/76797/6 +# +# Related: +# https://forums.swift.org/t/how-to-build-swift-package-as-xcframework/41414/57 + +# Script modified from https://docs.emergetools.com/docs/analyzing-a-spm-framework-ios + +PACKAGE_NAME=${1-} +if [ -z "$PACKAGE_NAME" ]; then + echo "No package name provided. Using the first scheme found in the Package.swift." + PACKAGE_NAME=$(xcodebuild -list | awk 'schemes && NF>0 { print $1; exit } /Schemes:$/ { schemes = 1 }') + echo "Using: $PACKAGE_NAME" +fi + +# Swift optimization level: -Onone (no optimization), -O (optimize for speed), -Osize (optimize for size) +# Default to -O for release builds, can be overridden with SWIFT_OPTIMIZATION_LEVEL environment variable +SWIFT_OPTIMIZATION_LEVEL="${SWIFT_OPTIMIZATION_LEVEL:--O}" +echo "Swift optimization level: $SWIFT_OPTIMIZATION_LEVEL" + +# FIXME: Original script was in subfolder, this is in repo root for the time being. +# +# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd -P)" +# PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +PROJECT_ROOT=$(pwd) + +PROJECT_BUILD_DIR="${PROJECT_BUILD_DIR:-"${PROJECT_ROOT}/build"}" +XCODEBUILD_BUILD_DIR="$PROJECT_BUILD_DIR/xcodebuild" +XCODEBUILD_DERIVED_DATA_PATH="$XCODEBUILD_BUILD_DIR/DerivedData" + +echo "PROJECT_BUILD_DIR is $PROJECT_BUILD_DIR" + +build_framework() { + local sdk="$1" + local destination="$2" + local scheme="$3" + + local XCODEBUILD_ARCHIVE_PATH="./build/$scheme-$sdk.xcarchive" + + rm -rf "$XCODEBUILD_ARCHIVE_PATH" + + # TODO: Consider using this env var to switch between static (default) + # and dynamic (required for XCFramework) + # + # See: + # https://github.com/OpenSwiftUIProject/ProtobufKit/blob/937eae5426277bec040c7f99bc8e1498c30ed467/Package.swift#L30 + # LIBRARY_TYPE=dynamic xcodebuild archive \ + xcodebuild archive \ + -scheme "$scheme" \ + -archivePath "$XCODEBUILD_ARCHIVE_PATH" \ + -derivedDataPath "$XCODEBUILD_DERIVED_DATA_PATH" \ + -sdk "$sdk" \ + -destination "$destination" \ + BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ + INSTALL_PATH='Library/Frameworks' \ + SWIFT_OPTIMIZATION_LEVEL="$SWIFT_OPTIMIZATION_LEVEL" \ + OTHER_SWIFT_FLAGS=-no-verify-emitted-module-interface \ + | xcbeautify + + if [ "$sdk" = "macosx" ]; then + FRAMEWORK_MODULES_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Versions/Current/Modules" + mkdir -p "$FRAMEWORK_MODULES_PATH" + cp -r \ + "$XCODEBUILD_DERIVED_DATA_PATH/Build/Intermediates.noindex/ArchiveIntermediates/$scheme/BuildProductsPath/Release/$scheme.swiftmodule" \ + "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule" + rm -rf "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules" + ln -s Versions/Current/Modules "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules" + else + FRAMEWORK_MODULES_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules" + mkdir -p "$FRAMEWORK_MODULES_PATH" + cp -r \ + "$XCODEBUILD_DERIVED_DATA_PATH/Build/Intermediates.noindex/ArchiveIntermediates/$scheme/BuildProductsPath/Release-$sdk/$scheme.swiftmodule" \ + "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule" + fi + + # Delete private and package swiftinterface + rm -f "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule/*.package.swiftinterface" + rm -f "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule/*.private.swiftinterface" +} + +copy_resource_bundles() { + local sdk="$1" + local scheme="$2" + + local XCODEBUILD_ARCHIVE_PATH="./build/$scheme-$sdk.xcarchive" + local FRAMEWORK_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework" + + # Find all resource bundles in DerivedData + local BUNDLE_PATH="$XCODEBUILD_DERIVED_DATA_PATH/Build/Intermediates.noindex/ArchiveIntermediates/$scheme/IntermediateBuildFilesPath/UninstalledProducts/$sdk" + + # Copy all .bundle files found + if [ -d "$BUNDLE_PATH" ]; then + find "$BUNDLE_PATH" -name "*.bundle" -maxdepth 1 -type d -print0 | while IFS= read -r -d '' bundle; do + bundle_name=$(basename "$bundle") + echo "Copying resource bundle: $bundle_name to $FRAMEWORK_PATH" + # Remove symlink if it exists and copy the actual bundle + rm -rf "${FRAMEWORK_PATH:?}/$bundle_name" + cp -R "$bundle" "$FRAMEWORK_PATH/" + done + else + echo "Warning: Bundle path not found: $BUNDLE_PATH" + fi +} + +build_framework "iphonesimulator" "generic/platform=iOS Simulator" "$PACKAGE_NAME" +copy_resource_bundles "iphonesimulator" "$PACKAGE_NAME" + +build_framework "iphoneos" "generic/platform=iOS" "$PACKAGE_NAME" +copy_resource_bundles "iphoneos" "$PACKAGE_NAME" + +# No macOS support because of UIKit in the dependencies +# +# build_framework "macosx" "generic/platform=macOS" "$PACKAGE_NAME" +# copy_resource_bundles "macosx" "$PACKAGE_NAME" + +echo "Builds completed successfully." + +pushd "$PROJECT_BUILD_DIR" > /dev/null + +rm -rf "$PACKAGE_NAME.xcframework" +xcodebuild -create-xcframework \ + -framework "$PACKAGE_NAME-iphonesimulator.xcarchive/Products/Library/Frameworks/$PACKAGE_NAME.framework" \ + -framework "$PACKAGE_NAME-iphoneos.xcarchive/Products/Library/Frameworks/$PACKAGE_NAME.framework" \ + -output "$PACKAGE_NAME.xcframework" + +cp -r "$PACKAGE_NAME-iphonesimulator.xcarchive/dSYMs" "$PACKAGE_NAME.xcframework/ios-arm64_x86_64-simulator" +cp -r "$PACKAGE_NAME-iphoneos.xcarchive/dSYMs" "$PACKAGE_NAME.xcframework/ios-arm64" + +zip -r "$PACKAGE_NAME.xcframework.zip" "$PACKAGE_NAME.xcframework" > /dev/null + +# TODO: Remove emoji, print all in green +echo "✅ XCFramework generated at $(pwd)/$PACKAGE_NAME.xcframework" + +popd > /dev/null diff --git a/ios/Demo-iOS/Gutenberg.xcodeproj/project.pbxproj b/ios/Demo-iOS/Gutenberg.xcodeproj/project.pbxproj index c9268e1d..25b9b676 100644 --- a/ios/Demo-iOS/Gutenberg.xcodeproj/project.pbxproj +++ b/ios/Demo-iOS/Gutenberg.xcodeproj/project.pbxproj @@ -15,8 +15,24 @@ 246852562EAABB7800ED1F09 /* WordPressAPI in Frameworks */ = {isa = PBXBuildFile; productRef = 0C4F59A12BEFF4980028BD96 /* WordPressAPI */; }; 2468526B2EAACCA100ED1F09 /* AuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246852682EAACCA100ED1F09 /* AuthenticationManager.swift */; }; 2468526C2EAACCA100ED1F09 /* ConfigurationStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246852692EAACCA100ED1F09 /* ConfigurationStorage.swift */; }; + 3F8A1FF62ED854BE00117262 /* GutenbergKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F8A1FF52ED854BE00117262 /* GutenbergKit.xcframework */; }; + 3F8A1FF72ED854BE00117262 /* GutenbergKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F8A1FF52ED854BE00117262 /* GutenbergKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 3F8A1FF82ED854BE00117262 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3F8A1FF72ED854BE00117262 /* GutenbergKit.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 0C4F598B2BEFF4970028BD96 /* Gutenberg.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Gutenberg.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0C4F59A72BEFF4980028BD96 /* ConfigurationItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationItem.swift; sourceTree = ""; }; @@ -26,10 +42,13 @@ 0CE8E7922C339B1B00B9DC67 /* GutenbergKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = GutenbergKit; path = ../..; sourceTree = ""; }; 246852682EAACCA100ED1F09 /* AuthenticationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationManager.swift; sourceTree = ""; }; 246852692EAACCA100ED1F09 /* ConfigurationStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationStorage.swift; sourceTree = ""; }; + 3F8A1FEB2ED851AF00117262 /* XCFrameworkIntegrationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCFrameworkIntegrationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F8A1FF52ED854BE00117262 /* GutenbergKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GutenbergKit.xcframework; path = ../../build/GutenbergKit.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ 2468525B2EAAC62B00ED1F09 /* Views */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = Views; sourceTree = ""; }; + 3F8A1FEC2ED851AF00117262 /* XCFrameworkIntegrationTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = XCFrameworkIntegrationTests; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -42,6 +61,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3F8A1FE82ED851AF00117262 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F8A1FF62ED854BE00117262 /* GutenbergKit.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -52,6 +79,7 @@ 0CE8E7882C339B0600B9DC67 /* Sources */, 0C83424D2C339B7F00CAA762 /* Resources */, 0CE8E78A2C339B0600B9DC67 /* PreviewContent */, + 3F8A1FEC2ED851AF00117262 /* XCFrameworkIntegrationTests */, 0C4F598C2BEFF4970028BD96 /* Products */, 0CF6E04A2BEFF60E00EDEE8A /* Frameworks */, ); @@ -61,6 +89,7 @@ isa = PBXGroup; children = ( 0C4F598B2BEFF4970028BD96 /* Gutenberg.app */, + 3F8A1FEB2ED851AF00117262 /* XCFrameworkIntegrationTests.xctest */, ); name = Products; sourceTree = ""; @@ -95,6 +124,7 @@ 0CF6E04A2BEFF60E00EDEE8A /* Frameworks */ = { isa = PBXGroup; children = ( + 3F8A1FF52ED854BE00117262 /* GutenbergKit.xcframework */, ); name = Frameworks; sourceTree = ""; @@ -135,6 +165,29 @@ productReference = 0C4F598B2BEFF4970028BD96 /* Gutenberg.app */; productType = "com.apple.product-type.application"; }; + 3F8A1FEA2ED851AF00117262 /* XCFrameworkIntegrationTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3F8A1FF12ED851AF00117262 /* Build configuration list for PBXNativeTarget "XCFrameworkIntegrationTests" */; + buildPhases = ( + 3F8A1FE72ED851AF00117262 /* Sources */, + 3F8A1FE82ED851AF00117262 /* Frameworks */, + 3F8A1FE92ED851AF00117262 /* Resources */, + 3F8A1FF82ED854BE00117262 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 3F8A1FEC2ED851AF00117262 /* XCFrameworkIntegrationTests */, + ); + name = XCFrameworkIntegrationTests; + packageProductDependencies = ( + ); + productName = XCFrameworkIntegrationTests; + productReference = 3F8A1FEB2ED851AF00117262 /* XCFrameworkIntegrationTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -142,12 +195,15 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1510; + LastSwiftUpdateCheck = 2600; LastUpgradeCheck = 2600; TargetAttributes = { 0C4F598A2BEFF4970028BD96 = { CreatedOnToolsVersion = 15.1; }; + 3F8A1FEA2ED851AF00117262 = { + CreatedOnToolsVersion = 26.0; + }; }; }; buildConfigurationList = 0C4F59862BEFF4970028BD96 /* Build configuration list for PBXProject "Gutenberg" */; @@ -167,6 +223,7 @@ projectRoot = ""; targets = ( 0C4F598A2BEFF4970028BD96 /* Gutenberg */, + 3F8A1FEA2ED851AF00117262 /* XCFrameworkIntegrationTests */, ); }; /* End PBXProject section */ @@ -181,6 +238,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3F8A1FE92ED851AF00117262 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -195,6 +259,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3F8A1FE72ED851AF00117262 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ @@ -387,6 +458,44 @@ }; name = Release; }; + 3F8A1FEF2ED851AF00117262 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.wordpress.XCFrameworkIntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3F8A1FF02ED851AF00117262 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.wordpress.XCFrameworkIntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -408,6 +517,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 3F8A1FF12ED851AF00117262 /* Build configuration list for PBXNativeTarget "XCFrameworkIntegrationTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3F8A1FEF2ED851AF00117262 /* Debug */, + 3F8A1FF02ED851AF00117262 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/ios/Demo-iOS/Gutenberg.xcodeproj/xcshareddata/xcschemes/XCFrameworkIntegrationTests.xcscheme b/ios/Demo-iOS/Gutenberg.xcodeproj/xcshareddata/xcschemes/XCFrameworkIntegrationTests.xcscheme new file mode 100644 index 00000000..e35977fa --- /dev/null +++ b/ios/Demo-iOS/Gutenberg.xcodeproj/xcshareddata/xcschemes/XCFrameworkIntegrationTests.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Demo-iOS/Sources/Views/AddSiteView.swift b/ios/Demo-iOS/Sources/Views/AddSiteView.swift index 84af57c4..640676d4 100644 --- a/ios/Demo-iOS/Sources/Views/AddSiteView.swift +++ b/ios/Demo-iOS/Sources/Views/AddSiteView.swift @@ -1,6 +1,5 @@ import SwiftUI import AuthenticationServices -import GutenbergKit /// View for adding a new editor configuration with site integration struct AddSiteView: View { diff --git a/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.swift b/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.swift new file mode 100644 index 00000000..3f0f5f76 --- /dev/null +++ b/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.swift @@ -0,0 +1,38 @@ +import GutenbergKit +import Testing + +struct `XCFramework integration test` { + + @Test func `EditorConfigurationBuilder can be used`() { + #expect( + EditorConfigurationBuilder() + .setShouldHideTitle(true) + .build() + .shouldHideTitle + == + true + ) + } + + @MainActor + @Test func `implicit test for CSS loading from XCFramework bundle`() async { + // Would like to use the following: + // + // #expect(processExitsWith: .success) { + // _ = HTMLPreviewManager() + // } + // + // But it's not possible because these tests and the library target iOS, on which the API is unavailalable. + // + // See: + // + // - https://github.com/swiftlang/swift-evolution/blob/d2111b0f8e725ffa68d124e9570cccb20bde194c/proposals/testing/0008-exit-tests.md#:~:text=If%20a%20platform%20does%20not%20support%20exit%20tests%20(generally%20because%20it%20does%20not%20support%20spawning%20or%20awaiting%20child%20processes)%2C%20then%20we%20define%20SWT_NO_EXIT_TESTS%20when%20we%20build%20it. + // - https://github.com/swiftlang/swift-testing/pull/324/files#diff-d8ec9e3f3ab018bd21f22d4e11152b4d3cc981bc509652525df761a4e4295d2eR25-R27 + // + // So, we just init the object and trust that if the assertion below runs, there was no crash via the internal `assert`. + // + // This works because in CI we build the XCFramework with -Onone for integration testing, making `assert`s run. + _ = HTMLPreviewManager() + #expect(true, "Placeholder expectation after code that would crash if bundle read failed.") + } +} diff --git a/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.xctestplan b/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.xctestplan new file mode 100644 index 00000000..9ca646c6 --- /dev/null +++ b/ios/Demo-iOS/XCFrameworkIntegrationTests/XCFrameworkIntegrationTests.xctestplan @@ -0,0 +1,25 @@ +{ + "configurations" : [ + { + "id" : "51606B53-6F98-44E9-AB63-ED180087748D", + "name" : "Test Scheme Action", + "options" : { + + } + } + ], + "defaultOptions" : { + "performanceAntipatternCheckerEnabled" : true + }, + "testTargets" : [ + { + "parallelizable" : false, + "target" : { + "containerPath" : "container:Gutenberg.xcodeproj", + "identifier" : "3F8A1FEA2ED851AF00117262", + "name" : "XCFrameworkIntegrationTests" + } + } + ], + "version" : 1 +} diff --git a/ios/Sources/GutenbergKit/Gutenberg/assets/api-fetch-Dn1G4fae.js b/ios/Sources/GutenbergKit/Gutenberg/assets/api-fetch-Dn1G4fae.js deleted file mode 100644 index ed8297f0..00000000 --- a/ios/Sources/GutenbergKit/Gutenberg/assets/api-fetch-Dn1G4fae.js +++ /dev/null @@ -1 +0,0 @@ -import{g as o}from"./index-i0SaNwJU.js";const a=window.wp.apiFetch,{getQueryArg:u}=window.wp.url;function y(){const{siteApiRoot:e=""}=o();a.use(a.createRootURLMiddleware(e)),a.use(m),a.use(h),a.use(f),a.use(w),a.use(b),a.use(g),a.use(a.createPreloadingMiddleware(_))}function m(e,t){return e.mode="cors",delete e.headers["x-wp-api-fetch-from-editor"],t(e)}function h(e,t){const{siteApiNamespace:s,namespaceExcludedPaths:n}=o(),c=new RegExp(`(${s.join("|")})`);return e.path&&!n.some(i=>e.path.startsWith(i))&&!c.test(e.path)&&(e.path=e.path.replace(/^(?\/?(?:[\w.-]+\/){2})/,`$${s[0]}`)),t(e)}function f(e,t){const{authHeader:s}=o();return e.headers=e.headers||{},s&&(e.headers.Authorization=s,e.credentials="omit"),t(e)}function w(e,t){return[/^\/wp\/v2\/posts\/-?\d+/,/^\/wp\/v2\/pages\/-?\d+/].some(c=>c.test(e.path))?Promise.resolve([]):t(e)}function b(e,t){return e.path&&e.path.startsWith("/wp/v2/media")&&e.method==="POST"&&e.body instanceof FormData&&e.body.get("post")==="-1"&&e.body.delete("post"),t(e)}function g(e,t){if(e.path&&e.path.indexOf("oembed")!==-1){let c=function(){const r=document.createElement("a");return r.href=s,r.innerText=s,{html:r.outerHTML,type:"rich",provider_name:"Embed"}};const s=u(e.path,"url"),n=t(e,t);return new Promise(r=>{n.then(i=>{if(i.html){const l=document.implementation.createHTMLDocument("");l.body.innerHTML=i.html;const p=['[class="embed-youtube"]','[class="embed-vimeo"]','[class="embed-dailymotion"]','[class="embed-ted"]'].join(","),d=l.querySelector(p);i.html=d?d.innerHTML:i.html}r(i)}).catch(()=>{r(c())})})}return t(e,t)}const _={"/wp/v2/types?context=view":{body:{post:{description:"",hierarchical:!1,has_archive:!1,name:"Posts",slug:"post",taxonomies:["category","post_tag"],rest_base:"posts",rest_namespace:"wp/v2",template:[],template_lock:!1,_links:{}},page:{description:"",hierarchical:!0,has_archive:!1,name:"Pages",slug:"page",taxonomies:[],rest_base:"pages",rest_namespace:"wp/v2",template:[],template_lock:!1,_links:{}}}},"/wp/v2/types/post?context=edit":{body:{name:"Posts",slug:"post",supports:{title:!0,editor:!0,author:!0,thumbnail:!0,excerpt:!0,trackbacks:!0,"custom-fields":!0,comments:!0,revisions:!0,"post-formats":!0,autosave:!0},taxonomies:["category","post_tag"],rest_base:"posts",rest_namespace:"wp/v2",template:[],template_lock:!1}}};export{y as initializeApiFetch}; diff --git a/ios/Sources/GutenbergKit/Gutenberg/assets/ar-B48uZRT7.js b/ios/Sources/GutenbergKit/Gutenberg/assets/ar-B48uZRT7.js deleted file mode 100644 index bc465756..00000000 --- a/ios/Sources/GutenbergKit/Gutenberg/assets/ar-B48uZRT7.js +++ /dev/null @@ -1,12 +0,0 @@ -const e=[],t=[],o=[],s=[],a=[],i=[],n=[],r=[],l=[],c=[],d=[],u=[],p=[],h=[],m=[],b=[],g=[],y=[],k=[],f=[],w=[],v=[],S=[],C=[],T=[],A=[],P=[],x=[],$=[],D=[],L=[],N=[],M=["قطع"],E=["تجاهل"],I=[],R=[],B=[],F=[],z=["تعليقات"],U=[],V=["عرض"],W=[],H=[],G=[],O=["الصفحة الرئيسية"],Y=[],q=[],j=[],J=[],Q=[],X=[],K=[],_=[],Z=[],ee=[],te=[],oe=[],se=[],ae=[],ie=[],ne=["صفوف"],re=[],le=[],ce=[],de=[],ue=[],pe=[],he=[],me=[],be=[],ge=[],ye=[],ke=[],fe=[],we=[],ve=[],Se=[],Ce=[],Te=[],Ae=["البريد الإلكتروني"],Pe=["المصدر"],xe=["الخطوط"],$e=[],De=[],Le=[],Ne=[],Me=[],Ee=["فصل"],Ie=["كلمة المرور"],Re=["هامش"],Be=["الأعداد"],Fe=[],ze=[],Ue=[],Ve=["بإنتظار المراجعة"],We=["اقتراحات"],He=["اللغة"],Ge=["تفعيل"],Oe=["الدقة"],Ye=["إدراج"],qe=["Openverse"],je=["الظل"],Je=["وسط"],Qe=["الموضع"],Xe=["مثتبة"],Ke=["التلده"],_e=["CSS"],Ze=["مقاطع فيديو"],et=[],tt=["إنقاص"],ot=["زيادة"],st=["كلمات توضيحية"],at=["نمط"],it=["مقبض"],nt=["XXL"],rt=["الخط"],lt=["مقيده"],ct=["ع6"],dt=["ع5"],ut=["ع4"],pt=["ع3"],ht=["ع2"],mt=["ع1"],bt=["الفئات"],gt=["تمرير المؤشر"],yt=["إلغاء تعيين"],kt=["الآن"],ft=["الآباء"],wt=["اللاحقة"],vt=["البادئة"],St=["يقول"],Ct=["استجابة"],Tt=["الردود"],At=["كُدس"],Pt=["أسبوع"],xt=["غير صالح"],$t=["قفل"],Dt=["الغاء القفل"],Lt=["معاينة"],Nt=["تمّ التنفيذ"],Mt=["أيقونة"],Et=["حذف"],It=["إجراءات"],Rt=["إعادة تسمية"],Bt=["Aa"],Ft=["الأنماط"],zt=["قوائم"],Ut=["رد"],Vt=["العناصر"],Wt=["القوائم الفرعية"],Ht=["دائمًا"],Gt=["العرض"],Ot=["إشارة مرجعية"],Yt=["تمييز"],qt=["طبق الألوان"],jt=["الألوان"],Jt=["السهم"],Qt=["صف"],Xt=["ضبط"],Kt=["انسياب"],_t=["الثني"],Zt=["النشر"],eo=["النمط"],to=["نصف القطر"],oo=["الهامش"],so=["التراكُب اللوني (Duotone)"],ao=["الشعار"],io=["التمييز"],no=["الظِلال"],ro=["التخطيط"],lo=["منقط"],co=["متقطع"],uo=["تخصيص"],po=["إطار"],ho=["شبكة"],mo=["المنطقة"],bo=["إضافة إقتباس/زيادة المسافة البادئة"],go=["إزالة إقتباس/إنقاص المسافة البادئة"],yo=["مرتب"],ko=["غير مرتب"],fo=["سحب"],wo=["محاذاة"],vo=["الكتابة بأحرف كبيرة"],So=["أحرف صغيرة"],Co=["أحرف كبيرة"],To=["عمودي"],Ao=["أفقي"],Po=["القوالب"],xo=["الكلمة المفتاحية"],$o=["عوامل التصفية"],Do=["زخرفة"],Lo=["فقط"],No=["استثناء"],Mo=["تضمين"],Eo=["المظهر"],Io=["التفضيلات"],Ro=["النوع"],Bo=["التسمية"],Fo=["فصول"],zo=["أوصاف"],Uo=["كلمات توضيحية"],Vo=["ترجمات"],Wo=["الوسوم"],Ho=["التفاصيل"],Go=["شعاعي"],Oo=["خطي"],Yo=["غير معروف"],qo=["أحرف"],jo=["الوصف"],Jo=["الأساس"],Qo=["كاتب"],Xo=["الأصل"],Ko=["الاسم"],_o=["صورة"],Zo=["منظر أفقي"],es=["مختلط"],ts=["يمين"],os=["يسار"],ss=["أسفل"],as=["أعلى"],is=["الحشو"],ns=["مسافة التباعد"],rs=["الإتجاه"],ls=["قص"],cs=["تدوير"],ds=["تكبير"],us=["تصميم"],ps=["نصّ"],hs=["الإشعارات"],ms=["صفحة","صفحة واحدة","صفحتان","صفحات","صفحة","صفحة"],bs=["إزاحة"],gs=["مقالات"],ys=["صفحات"],ks=["غير مصنف"],fs=["أبيض"],ws=["أسود"],vs=["أحرف علوية"],Ss=["أحرف سفلية"],Cs=["الأنماط"],Ts=["الخطوط"],As=["المحتوى "],Ps=["القائمة"],xs=["الاتصال"],$s=["حول"],Ds=["الرئيسية"],Ls=["المستخدم"],Ns=["الموقع"],Ms=["إنشاء"],Es=["سطح المكتب"],Is=["الجوال"],Rs=["الأجهزة اللوحية"],Bs=["استطلاع رأي"],Fs=["اجتماعي"],zs=["لون كامل"],Us=["النوع"],Vs=["زاوية"],Ws=["اختيار"],Hs=["قالب"],Gs=["فارغ"],Os=["الأزرار"],Ys=["الخلفية"],qs=["مساعدة"],js=["بدون عنوان"],Js=["التالي"],Qs=["السابق"],Xs=["إنهاء"],Ks=["استبدال"],_s=["أداة الإدراج"],Zs=["بودكاست"],ea=["التنقّل"],ta=["القالب"],oa=["التدرّج"],sa=["أزرق منتصف الليل"],aa=["النسخة"],ia=["الأبعاد"],na=["القوالب"],ra=["أضف"],la=["اللون"],ca=["مُخصص"],da=["مسودة"],ua=["تخطي"],pa=["الروابط"],ha=["القائمة"],ma=["تذييل"],ba=["مجموعة"],ga=["فئة"],ya=["افتراضي"],ka=["بحث"],fa=["التقويم"],wa=["رجوع"],va=["كتاب إلكتروني"],Sa=["تحته خط"],Ca=["صورة مصغرة"],Ta=["تعليقات توضيحية"],Aa=["وسائط"],Pa=["وسائط"],xa=["الأنماط"],$a=["عام"],Da=["الخيارات"],La=["دقائق"],Na=["ساعات"],Ma=["الوقت"],Ea=["السنة"],Ia=["اليوم"],Ra=["ديسمبر"],Ba=["نوفمبر"],Fa=["أكتوبر"],za=["سبتمبر"],Ua=["أغسطس"],Va=["يوليو"],Wa=["يونيو"],Ha=["مايو"],Ga=["أبريل"],Oa=["مارس"],Ya=["فبراير"],qa=["يناير"],ja=["الشهر"],Ja=["غلاف"],Qa=["ضخم"],Xa=["متوسط"],Ka=["عادي"],_a=["العناصر"],Za=["الصورة الرمزية Avatar"],ei=["عرض"],ti=["HTML"],oi=["غِشاء"],si=["فاصلة علوية مائلة Backtick"],ai=["فترة"],ii=["فاصلة"],ni=["الحالي"],ri=["العنوان"],li=["إنشاء"],ci=["معارض"],di=["XL"],ui=["L"],pi=["M"],hi=["S"],mi=["صغير"],bi=["تم التجاهل"],gi=["تلقائي"],yi=["تحميل مسبق"],ki=["الدعم"],fi=["الأرشيف"],wi=["كبير"],vi=["ملف"],Si=["عمود"],Ci=["حلقة"],Ti=["تشغيل تلقائي"],Ai=["حفظ تلقائي"],Pi=["عنوان فرعي"],xi=["موافق"],$i=["إزالة الربط"],Di=["تعدد الصفحات"],Li=["الارتفاع"],Ni=["العرض"],Mi=["متقدم"],Ei=["مجدول"],Ii=["الإضافات"],Ri=["فقرات"],Bi=["عناوين"],Fi=["كلمات"],zi=["عام"],Ui=["خاص"],Vi=["عنصر"],Wi=["وسم"],Hi=["فوراً"],Gi=["جاري الحفظ"],Oi=["منشور"],Yi=["جدولة"],qi=["تحديث"],ji=["نسخ"],Ji=["محادثة"],Qi=["الحالة"],Xi=["قياسي"],Ki=["الجانب"],_i=["ترتيب"],Zi=["تم الحفظ"],en=["التضمينات"],tn=["مكوّنات"],on=["تراجع"],sn=["إعادة"],an=["تكرار"],nn=["إزالة"],rn=["الظهور"],ln=["المكوّن"],cn=["المستند"],dn=["أدوات"],un=["المُحرر"],pn=["الإعدادات"],hn=["إعادة تعيين"],mn=["إيقاف"],bn=[],gn=["مساءً"],yn=["صباحًا"],kn=["رابط الـ"],fn=["إرسال"],wn=["إغلاق"],vn=["رابط"],Sn=["نصّ مشطوب"],Cn=["مائل"],Tn=["عريض"],An=["تصنيف"],Pn=["تحديد"],xn=["فيديو"],$n=["جدول"],Dn=["كود قصير"],Ln=["فاصل"],Nn=["اقتباس"],Mn=["فقرة"],En=["قائمة"],In=["صورة"],Rn=["الحجم"],Bn=["صورة"],Fn=["معاينة"],zn=["عنوان"],Un=["صور"],Vn=["بدون"],Wn=["معرض"],Hn=["المزيد"],Gn=["تقليدي"],On=["فيديو"],Yn=["صوتيات"],qn=["موسيقى"],jn=["صورة"],Jn=["مدونة"],Qn=["المقالة"],Xn=["أعمدة"],Kn=["التجارب"],_n=["كود"],Zn=["تصنيفات"],er=["زر"],tr=["تطبيق"],or=["إلغاء"],sr=["تحرير"],ar=["صوت"],ir=["مسح"],nr=["ودجات"],rr=["الكُتّاب"],lr=["الاسم اللطيف"],cr=["التعليق"],dr=["مناقشة"],ur=["المقتطف"],pr=["نشر"],hr=["البيانات الوصفية"],mr=["حفظ"],br=["المراجعات"],gr=["وثائق المساعدة"],yr=["Gutenberg"],kr=["عرض توضيحي"],fr={100:["100"],"block descriptionDisplay a custom date.":[],"block descriptionDisplays a foldable layout that groups content in collapsible sections.":[],"block descriptionContains the hidden or revealed content beneath the heading.":[],"block descriptionWraps the heading and panel in one unit.":[],"block descriptionDisplays a heading that toggles the accordion panel.":[],"Media items":[],"Search media":[],"Select Media":[],"Are you sure you want to delete this note? This will also delete all of this note's replies.":[],"Revisions (%d)":[],"paging%1$d of %2$d":[],"%d item":[],"Color Variations":[],"Shadow Type":[],"Font family to uninstall is not defined.":[],"Select Featured Image":[],"Active when used":[],"Registered Templates":[],"Failed to create page. Please try again.":[],"%s page created successfully.":[],"Full content":[],"No content":[],"Display content":[],"The exact type of breadcrumbs shown will vary automatically depending on the page in which this block is displayed. In the specific case of a hierarchical post type with taxonomies, the breadcrumbs can either reflect its post hierarchy (default) or the hierarchy of its assigned taxonomy terms.":[],"Prefer taxonomy terms":[],"The text will resize to fit its container, resetting other font size settings.":[],"Enables a new media modal experience powered by Data Views for improved media library management.":[],"Data Views: new media modal":[],"block keywordterm title":[],"block descriptionDisplays the name of a taxonomy term.":[],"block titleTerm Name":[],"block descriptionDisplays the post count of a taxonomy term.":[],"block titleTerm Count":[],"block keywordmathematics":[],"block keywordlatex":[],"block keywordformula":[],"block descriptionDisplay mathematical notation using LaTeX.":[],"block titleMath":[],"block descriptionDisplay a breadcrumb trail for hierarchical post types or based on taxonomy terms.":[],"block titleBreadcrumbs":[],"Overrides currently don't support image links. Remove the link first before enabling overrides.":[],Math:[],"CSS classes":[],"Close Notes":[],Notes:e,"View notes":[],"New note":[],"Add note":[],Reopened:t,"Marked as resolved":[],"Edit note %1$s by %2$s":[],"Reopen noteReopen":[],"Back to block":[],"Add new note":[],"Note: %s":[],"Only logged in users can see Notes.":[],"No notes available.":[],"Note deleted.":[],"Note reopened.":[],"Note added.":[],"Reply added.":[],Note:o,"You are about to duplicate a bundled template. Changes will not be live until you activate the new template.":[],'Do you want to activate this "%s" template?':[],"template typeCustom":[],"Created templates":[],"Reset view":[],"Unknown error when running custom validation.":[],"No elements found":[],"Term template block display settingGrid view":[],"Term template block display settingList view":[],"Display the terms' names and number of posts assigned to each term.":[],"Name & Count":[],"Display the terms' names.":[],"When specific terms are selected, only those are displayed.":[],"When specific terms are selected, the order is based on their selection order.":[],"Selected terms":[],"Show nested terms":[],"Display terms based on specific criteria.":[],"Display terms based on the current taxonomy archive. For hierarchical taxonomies, shows children of the current term. For non-hierarchical taxonomies, shows all terms.":[],"Make term name a link":[],"Change bracket type":[],"Angle brackets":[],"Curly brackets":[],"Square brackets":[],"Round brackets":[],"No brackets":[],"e.g., x^2, \\frac{a}{b}":[],"LaTeX math syntax":[],"Set a consistent aspect ratio for all images in the gallery.":[],"All gallery images updated to aspect ratio: %s":[],"Comments block: You’re currently using the legacy version of the block. The following is just a placeholder - the final styling will likely look different. For a better representation and more customization options, switch the block to its editable mode.":[],"Show home link":[],Ancestor:s,"Source not registered":[],"Not connected":[],"No sources available":[],"Text will resize to fit its container.":[],"Fit text":[],"Allowed Blocks":[],"Specify which blocks are allowed inside this container.":[],"Select which blocks can be added inside this container.":[],"Manage allowed blocks":[],"Block hidden. You can access it via the List View (%s).":[],"Blocks hidden. You can access them via the List View (%s).":[],"Show or hide the selected block(s).":[],"Type of the comment.":[],"Creating comment failed.":[],"Comment field exceeds maximum length allowed.":[],"Creating a comment requires valid author name and email values.":[],"Invalid comment content.":[],"Cannot create a comment with that type.":[],"Sorry, you are not allowed to read this comment.":[],"Query parameter not permitted: %s":[],"Sorry, you are not allowed to read comments without a post.":[],"Sorry, this post type does not support notes.":[],"Note resolution status":[],Breadcrumbs:a,"block descriptionShow minutes required to finish reading the post. Can also show a word count.":[],"Reply to note %1$s by %2$s":[],"Reopen & Reply":[],"Original block deleted.":[],"Original block deleted. Note: %s":[],"Note date full date formatF j, Y g:i a":[],"Don't allow link notifications from other blogs (pingbacks and trackbacks) on new articles.":[],"Don't allow":[],"Allow link notifications from other blogs (pingbacks and trackbacks) on new articles.":[],Allow:i,"Trackbacks & Pingbacks":[],"Template activation failed.":[],"Template activated.":[],"Activating template…":[],"Template Type":[],"Compatible Theme":[],Inactive:n,Active:r,"Active templates":[],Deactivate:l,"Value must be a number.":[],"Show the number of words in the post.":[],"Word Count":[],"Show minutes required to finish reading the post.":[],"Time to Read":[],"Display as range":[],"Turns reading time range display on or offDisplay as range":[],item:c,term:d,tag:u,category:p,"Suspendisse commodo lacus, interdum et.":[],"Lorem ipsum dolor sit amet, consectetur.":[],"Block is hidden.":[],Visible:h,"Unsync and edit":[],"Synced with the selected %s.":[],"%s character":[],"Range of minutes to read%1$s–%2$s minutes":[],"block keywordtags":[],"block keywordtaxonomy":[],"block keywordterms":[],"block titleTerms Query":[],"block descriptionContains the block elements used to render a taxonomy term, like the name, description, and more.":[],"block titleTerm Template":[],Count:m,"Parent ID":[],"Term ID":[],"An error occurred while performing an update.":[],"+%s more participant":[],"100+ participants":[],"+%s":[],"100+":[],"%s more reply":[],"Show password":[],"Hide password":[],"Date time":[],"Value must be a valid color.":[],"Open custom CSS":[],"Go to: Patterns":[],"Go to: Templates":[],"Go to: Navigation":[],"Go to: Styles":[],"Go to: Template parts":[],"Go to: %s":[],"No terms found.":[],"Term Name":[],"Limit the number of terms you want to show. To show all terms, use 0 (zero).":[],"Max terms":[],"Count, low to high":[],"Count, high to low":[],"Name: Z → A":[],"Name: A → Z":[],"If unchecked, the page will be created as a draft.":[],"Publish immediately":[],"Create a new page to add to your Navigation.":[],"Create page":[],"Edit contents":[],"The Link Relation attribute defines the relationship between a linked resource and the current document.":[],"Link relation":[],"Blog home":[],Attachment:b,Post:g,"When patterns are inserted, default to a simplified content only mode for editing pattern content.":[],"contentOnly: Make patterns contentOnly by default upon insertion":[],"block bindings sourceTerm Data":[],"Updating failed because you were offline.":[],"Scheduling failed because you were offline.":[],"Publishing failed because you were offline.":[],"Choose pattern":[],"Could not get a valid response from the server.":[],"Unable to connect. Please check your Internet connection.":[],"block titleAccordion":[],"block titleAccordion Panel":[],"block titleAccordion Heading":[],"block titleAccordion Item":[],"Automatically load more content as you scroll, instead of showing pagination links.":[],"Enable infinite scroll":[],"Play inline enabled because of Autoplay.":[],"Display the post type label based on the queried object.":[],"Post Type Label":[],"Show post type label":[],"Post Type: Name":[],"Accordion title":[],"Accordion content will be displayed by default.":[],"Icon Position":[],"Display a plus icon next to the accordion header.":[],"Automatically close accordions when a new one is opened.":[],"Auto-close":[],"Set custom border radius":[],"Use border radius preset":[],'Post Type: "%s"':[],"Add Category":[],"Add Term":[],"Add Tag":[],"Click item: %s":[],To:y,From:k,"Year to date":[],"Last year":[],"Month to date":[],"Last 30 days":[],"Last 7 days":[],"Past month":[],"Past week":[],Yesterday:f,Today:w,"Every value must be a string.":[],"Value must be an array.":[],"Value must be true, false, or undefined":[],"Value must be an integer.":[],"Value must be a valid email address.":[],"Add page":[],Optional:v,"social link block variation nameSoundCloud":[],"Display a post's publish date.":[],"Publish Date":[],'"Read more" text':[],"Poster image preview":[],"Edit or replace the poster image.":[],"Set poster image":[],"social link block variation nameYouTube":[],"social link block variation nameYelp":[],"social link block variation nameX":[],"social link block variation nameWhatsApp":[],"social link block variation nameWordPress":[],"social link block variation nameVK":[],"social link block variation nameVimeo":[],"social link block variation nameTwitter":[],"social link block variation nameTwitch":[],"social link block variation nameTumblr":[],"social link block variation nameTikTok":[],"social link block variation nameThreads":[],"social link block variation nameTelegram":[],"social link block variation nameSpotify":[],"social link block variation nameSnapchat":[],"social link block variation nameSkype":[],"social link block variation nameShare Icon":[],"social link block variation nameReddit":[],"social link block variation namePocket":[],"social link block variation namePinterest":[],"social link block variation namePatreon":[],"social link block variation nameMedium":[],"social link block variation nameMeetup":[],"social link block variation nameMastodon":[],"social link block variation nameMail":[],"social link block variation nameLinkedIn":[],"social link block variation nameLast.fm":[],"social link block variation nameInstagram":[],"social link block variation nameGravatar":[],"social link block variation nameGitHub":[],"social link block variation nameGoogle":[],"social link block variation nameGoodreads":[],"social link block variation nameFoursquare":[],"social link block variation nameFlickr":[],"social link block variation nameRSS Feed":[],"social link block variation nameFacebook":[],"social link block variation nameEtsy":[],"social link block variation nameDropbox":[],"social link block variation nameDribbble":[],"social link block variation nameDiscord":[],"social link block variation nameDeviantArt":[],"social link block variation nameCodePen":[],"social link block variation nameLink":[],"social link block variation nameBluesky":[],"social link block variation nameBehance":[],"social link block variation nameBandcamp":[],"social link block variation nameAmazon":[],"social link block variation name500px":[],"block descriptionDescribe in a few words what this site is about. This is important for search results, sharing on social media, and gives overall clarity to visitors.":[],"There is no poster image currently selected.":[],"The current poster image url is %s.":[],"Comments pagination":[],"paging
Page
%1$s
of %2$d
":[],"%1$s is over: %2$s ago":[],"%1$s is in the past: %2$s":[],"%1$s between (inc): %2$s and %3$s":[],"%1$s is on or after: %2$s":[],"%1$s is on or before: %2$s":[],"%1$s is after: %2$s":[],"%1$s is before: %2$s":[],"%1$s starts with: %2$s":[],"%1$s doesn't contain: %2$s":[],"%1$s contains: %2$s":[],"%1$s is greater than or equal to: %2$s":[],"%1$s is less than or equal to: %2$s":[],"%1$s is greater than: %2$s":[],"%1$s is less than: %2$s":[],"Max.":[],"Min.":[],"The max. value must be greater than the min. value.":[],Unit:S,"Years ago":[],"Months ago":[],"Weeks ago":[],"Days ago":[],Years:C,Months:T,Weeks:A,Days:P,False:x,True:$,Over:D,"In the past":[],"Not on":[],"Between (inc)":[],"Starts with":[],"Doesn't contain":[],"After (inc)":[],"Before (inc)":[],After:L,Before:N,"Greater than or equal":[],"Less than or equal":[],"Greater than":[],"Less than":[],"%s, selected":[],"Go to the Previous Month":[],"Go to the Next Month":[],"Today, %s":[],"Date range calendar":[],"Date calendar":[],"Interactivity API: Full-page client-side navigation":[],"Set as default track":[],"Icon Size":[],"Icon size":[],"Only select
if the separator conveys important information and should be announced by screen readers.":[],"Sort and filter":[],"Write summary. Press Enter to expand or collapse the details.":[],"Default ()":[],"The ":[],"HTML preview is not yet fully accessible. Please switch screen reader to virtualized mode to navigate the below iFrame.":[],"Custom HTML Preview":[],"Multiple blocks selected":[],'Block name changed to: "%s".':[],'Block name reset to: "%s".':[],"https://wordpress.org/patterns/":[],"Patterns are available from the WordPress.org Pattern Directory, bundled in the active theme, or created by users on this site. Only patterns created on this site can be synced.":[],Source:Pe,"Theme & Plugins":[],"Pattern Directory":[],"Jump to footnote reference %1$d":[],"Mark as nofollow":[],"Empty template part":[],"Choose a template":[],"Manage fonts":["إدارة الخطوط"],Fonts:xe,"Install Fonts":[],Install:$e,"No fonts found. Try with a different search term.":[],"Font name…":[],"Select font variants to install.":[],"Allow access to Google Fonts":[],"You can alternatively upload files directly on the Upload tab.":[],"To install fonts from Google you must give permission to connect directly to Google servers. The fonts you install will be downloaded from Google and stored on your site. Your site will then use these locally-hosted fonts.":[],"Choose font variants. Keep in mind that too many variants could make your site slower.":[],"Upload font":[],"%1$d/%2$d variants active":[],"font styleNormal":[],"font weightExtra-bold":[],"font weightSemi-bold":[],"font weightNormal":[],"font weightExtra-light":[],"Add your own CSS to customize the appearance of the %s block. You do not need to include a CSS selector, just add the property and value.":[],'Imported "%s" from JSON.':[],"Import pattern from JSON":[],"A list of all patterns from all sources.":[],"An error occurred while reverting the template part.":[],Notice:De,"Error notice":[],"Information notice":[],"Warning notice":[],"Footnotes are not supported here. Add this block to post or page content.":[],"Comments form disabled in editor.":[],"Block: Paragraph":[],"Image settingsSettings":[],"Drop to upload":[],"Background image":[],"Only images can be used as a background image.":[],"No results found":[],"%d category button displayed.":[],"All patterns":[],"Display a list of assigned terms from the taxonomy: %s":[],"Specify how many links can appear before and after the current page number. Links to the first, current and last page are always visible.":[],"Number of links":[],Ungroup:Le,"Page Loaded.":[],"Loading page, please wait.":[],"block titleDate":["التاريخ"],"block titleContent":["المحتوى"],"block titleAuthor":["الكاتب"],"block keywordtoggle":[],"Default styles":[],"Reset the styles to the theme defaults":[],"Changes will apply to new posts only. Individual posts may override these settings.":[],"Breadcrumbs visible.":[],"Breadcrumbs hidden.":[],"Editor preferences":[],"The
element should be used for the primary content of your document only.":[],"Modified Date":[],"Overlay menu controls":[],'Navigation Menu: "%s"':[],"Enter fullscreen":[],"Exit fullscreen":["الخروج من الشاشة الكاملة"],"Select text across multiple blocks.":[],"Enables live collaboration and offline persistence between peers.":[],"Font family uninstalled successfully.":[],"Changes saved by %1$s on %2$s":[],"Unsaved changes by %s":[],"Preview in a new tab":[],"Disable pre-publish checks":[],"Show block breadcrumbs":[],"Hide block breadcrumbs":[],"Post overviewOutline":[],"Post overviewList View":[],"You can enable the visual editor in your profile settings.":[],"Submit Search":[],"block keywordreusable":[],"Pattern imported successfully!":[],"Invalid pattern JSON file":[],"Last page":["آخر صفحة"],"paging%1$s of %2$s":[],"Previous page":["الصفحة السابقة"],"First page":["الصفحة الأولى"],"%s item":["لا توجد عناصر (%s)","عنصر واحد (%s)","عنصران (%s)","%s عناصر","%s عنصر","%s عنصر"],"Use left and right arrow keys to resize the canvas. Hold shift to resize in larger increments.":[],"An error occurred while moving the item to the trash.":[],'"%s" moved to the trash.':[],"Go to the Dashboard":[],"%s name":[],"%s: Name":[],'The current menu options offer reduced accessibility for users and are not recommended. Enabling either "Open on Click" or "Show arrow" offers enhanced accessibility by allowing keyboard users to browse submenus selectively.':[],"Footnotes found in blocks within this document will be displayed here.":[],Footnotes:Ne,"Open command palette":[],"Note that the same template can be used by multiple pages, so any changes made here may affect other pages on the site. To switch back to editing the page content click the ‘Back’ button in the toolbar.":[],"Editing a template":[],"It’s now possible to edit page content in the site editor. To customise other parts of the page like the header and footer switch to editing the template using the settings sidebar.":[],Continue:Me,"Editing a page":[],"This pattern cannot be edited.":[],"Command palette":[],"Open the command palette.":[],Detach:Ee,"Edit Page List":[],"It appears you are trying to use the deprecated Classic block. You can leave this block intact, or remove it entirely. Alternatively, you can refresh the page to use the Classic block.":[],"It appears you are trying to use the deprecated Classic block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely. Alternatively, you can refresh the page to use the Classic block.":[],"Name for applying graphical effectsFilters":["عوامل التصفية"],"Hide block tools":[],"My patterns":["أنماطي"],"Disables the TinyMCE and Classic block.":[],"`experimental-link-color` is no longer supported. Use `link-color` instead.":[],"Sync status":[],"block titlePattern Placeholder":[],"block keywordreferences":["المراجع"],"block titleFootnotes":[],"Unsynced pattern created: %s":[],"Synced pattern created: %s":[],"Untitled pattern block":[],"External media":[],"Select image block.":[],"Patterns that can be changed freely without affecting the site.":[],"Patterns that are kept in sync across the site.":[],"Empty pattern":[],"An error occurred while deleting the items.":[],"Learn about styles":[],"Open style revisions":[],"Change publish date":[],Password:Ie,"An error occurred while duplicating the page.":[],"Publish automatically on a chosen date.":[],"Waiting for review before publishing.":[],"Not ready to publish.":["غير جاهز للنشر."],"Unable to duplicate Navigation Menu (%s).":[],"Duplicated Navigation Menu":[],"Unable to rename Navigation Menu (%s).":[],"Renamed Navigation Menu":[],"Unable to delete Navigation Menu (%s).":[],"Are you sure you want to delete this Navigation Menu?":[],"Navigation title":[],"Go to %s":["الانتقال إلى %s"],"Set the default number of posts to display on blog pages, including categories and tags. Some templates may override this setting.":[],"Set the Posts Page title. Appears in search results, and when the page is shared on social media.":[],"Blog title":["عنوان المدوّنة"],"Select what the new template should apply to:":[],"E.g. %s":[],"Manage what patterns are available when editing the site.":[],"My pattern":["نمطي"],"Create pattern":["إنشاء نمط"],"An error occurred while renaming the pattern.":[],"Hide & Reload Page":[],"Show & Reload Page":[],"Manage patterns":[],"Initial %d result loaded. Type to filter all available results. Use up and down arrow keys to navigate.":[],Footnote:Re,"Lowercase Roman numerals":[],"Uppercase Roman numerals":[],"Lowercase letters":[],"Uppercase letters":[],Numbers:Be,"Image is contained without distortion.":[],"Image covers the space evenly.":[],"Image size option for resolution controlFull Size":["الحجم الكامل"],"Image size option for resolution controlLarge":["كبير"],"Image size option for resolution controlMedium":["متوسط"],"Image size option for resolution controlThumbnail":[],Scale:Fe,"Scale down the content to fit the space if it is too big. Content that is too small will have additional padding.":[],"Scale option for dimensions controlScale down":[],"Do not adjust the sizing of the content. Content that is too large will be clipped, and content that is too small will have additional padding.":[],"Scale option for dimensions controlNone":["لا شيء"],"Fill the space by clipping what doesn't fit.":[],"Scale option for dimensions controlCover":["غلاف"],"Fit the content to the space without clipping.":[],"Scale option for dimensions controlContain":[],"Fill the space by stretching the content.":[],"Scale option for dimensions controlFill":[],"Aspect ratio option for dimensions controlCustom":[],"Aspect ratio option for dimensions controlOriginal":[],"Additional link settingsAdvanced":["إعدادات متقدمة"],"Change level":["تغيير المستوى"],"Position: %s":[],"The block will stick to the scrollable area of the parent %s block.":[],'"%s" in theme.json settings.color.duotone is not a hex or rgb string.':[],"An error occurred while creating the item.":[],"block titleTitle":["العنوان"],"block titleExcerpt":["المقتطف"],"View site (opens in a new tab)":[],"Last edited %s.":[],Page:ze,Parent:Ue,Pending:Ve,"Create draft":[],"No title":["بدون عنوان"],"Review %d change…":["مراجعة %d تغيير","مراجعة %d تغيير","مراجعة %d تغييرين","مراجعة %d تغييرات","مراجعة %d تغييراً","مراجعة %d تغير"],"Focal point top position":[],"Focal point left position":[],"Show label text":[],"No excerpt found":[],"Excerpt text":[],"The content is currently protected and does not have the available excerpt.":[],"This block will display the excerpt.":[],Suggestions:We,"Horizontal & vertical":[],"Expand search field":[],"Right to left":["من اليمين إلى اليسار"],"Left to right":["من اليسار إلى اليمين"],"Text direction":[],'A valid language attribute, like "en" or "fr".':[],Language:He,"Reset template part: %s":[],"Document not found":["لم يتم العثور على المستند"],"Navigation Menu missing.":[],"Navigation Menus are a curated collection of blocks that allow visitors to get around your site.":[],"Manage your Navigation Menus.":[],"%d pattern found":[],"Examples of blocks":[],"The relationship of the linked URL as space-separated link types.":[],"Rel attribute":[],'The duotone id "%s" is not registered in theme.json settings':[],"block descriptionHide and show additional content.":[],"block descriptionAdd an image or video with a text overlay.":[],"Save panel":[],"Close Styles":[],Activate:Ge,"Activate & Save":["تفعيل وحفظ"],"Write summary…":["اكتب ملخصًا…"],"Type / to add a hidden block":[],"Add an image or video with a text overlay.":[],"%d Block":[],"Add after":[],"Add before":[],"Site Preview":["معاينة الموقع"],"block descriptionDisplay an image to represent this site. Update this block and the changes apply everywhere.":[],"Add media":["أضف ملفات وسائط"],"Show block tools":[],"block keywordlist":[],"block keyworddisclosure":[],"block titleDetails":["التفاصيل"],"https://wordpress.org/documentation/article/page-post-settings-sidebar/#permalink":[],"https://wordpress.org/documentation/article/page-post-settings-sidebar/#excerpt":[],"https://wordpress.org/documentation/article/embeds/":[],"Open by default":[],"https://wordpress.org/documentation/article/customize-date-and-time-format/":[],"https://wordpress.org/documentation/article/page-jumps/":[],"%s minute":[],"Manage the fonts and typography used on captions.":[],"Display a post's last updated date.":[],"Post Modified Date":[],"Arrange blocks in a grid.":[],"Leave empty if decorative.":["اترك ذلك الحقل فارغًا إذا كان للزخرفة."],"Alternative text":["نص بديل"],Resolution:Oe,"Name for the value of the CSS position propertyFixed":["ثابت"],"Name for the value of the CSS position propertySticky":["مثبّت"],"Minimum column width":[],"captionWork/ %2$s":[],"Examples of blocks in the %s category":[],"Create new templates, or reset any customizations made to the templates supplied by your theme.":["قم بإنشاء قوالب جديدة أو إعادة تعيين أي تخصيصات تم إجراؤها على القوالب التي يوفرها قالبك."],"A custom template can be manually applied to any post or page.":[],"Customize the appearance of your website using the block editor.":[],"https://wordpress.org/documentation/article/wordpress-block-editor/":[],"Post meta":[],"Select the size of the source images.":[],"Reply to A WordPress Commenter":[],"Commenter Avatar":[],"block titleTime to Read":["مدة القراءة"],"Example:":[],"Image inserted.":["تم إدراج الصورة."],"Image uploaded and inserted.":["تم رفع وإدراج الصورة."],Insert:Ye,"External images can be removed by the external provider without warning and could even have legal compliance issues related to privacy legislation.":[],"This image cannot be uploaded to your Media Library, but it can still be inserted as an external image.":[],"Insert external image":["إدراج صورة خارجية"],"Fallback content":[],"Scrollable section":[],"Aspect ratio":["نسبة البعدين"],"Max number of words":["الحد الأقصى لعدد الكلمات"],"Choose or create a Navigation Menu":["اختيار قائمة التنقل أو إنشاؤها"],"Add submenu link":["إضافة رابط القائمة الفرعية"],"Search Openverse":["البحث في Openverse"],Openverse:qe,"Search audio":["بحث عن ملف صوتي"],"Search videos":["بحث عن مقاطع الفيديو"],"Search images":["بحث عن صور"],'caption"%1$s"/ %2$s':['"%1$s"/ %2$s'],"captionWork by %2$s/ %3$s":["هذا العمل بواسطة%2$s/ %3$s"],'caption"%1$s" by %2$s/ %3$s':['"%1$s" بواسطة %2$s/ %3$s'],"Learn more about CSS":["معرفة المزيد حول CSS"],"There is an error with your CSS structure.":["هناك خطأ في بنية CSS الخاصة بك."],Shadow:je,"Border & Shadow":["الحدود والظل"],Center:Je,'Page List: "%s" page has no children.':["قائمة الصفحات: لا تحتوي صفحة «%s» على أطفال."],"You have not yet created any menus. Displaying a list of your Pages":["لم تقم بعد بإنشاء أي قوائم. عرض قائمة بصفحاتك"],"Untitled menu":["قائمة بدون عنوان"],"Structure for Navigation Menu: %s":[],"(no title %s)":["(لا يوجد عنوان %s)"],"Align text":["محاذاة النص"],"Append to %1$s block at position %2$d, Level %3$d":["إلحاق المكوّن %1$s في الموضع %2$d، المستوى %3$d"],"%s block inserted":["تم إدراج المكوّن %s"],"Report %s":["الإبلاغ عن الـ %s"],"Copy styles":["نسخ الأنماط"],"Stretch items":["تمديد العناصر"],"Block vertical alignment settingSpace between":["المسافة البينية"],"Block vertical alignment settingStretch to fill":["التمدد لملء الفراغات"],"Untitled post %d":["منشور بدون عنوان %d"],"Printing since 1440. This is the development plugin for the block editor, site editor, and other future WordPress core functionality.":["بدأت الخطوط منذ عام 1440. هذه هي الإضافة لمحرر المكونات ومحرر الموقع ووظائف ووردبريس الأساسية المستقبلية الأخرى الخاصة بالتطوير."],"Style Variations":["تنوعات الأنماط"],"Apply globally":["التطبيق عالمياً"],"%s styles applied.":["%s الأنماط المطبقة."],"Currently selected position: %s":["المنصب المحدد حالياً: %s"],Position:Qe,"The block will not move when the page is scrolled.":["لن يتم تحريك المكوّن عند تمرير الصفحة."],"The block will stick to the top of the window instead of scrolling.":["سيلتصق المكوّن بأعلى النافذة بدلا من التمرير."],Sticky:Xe,"Paste styles":["لصق الأنماط"],"Pasted styles to %d blocks.":["تم لصق الأنماط لـ %d من المكوّنات."],"Pasted styles to %s.":["تم لصق الأنماط لـ %s."],"Unable to paste styles. Block styles couldn't be found within the copied content.":["غير قادر على لصق الأنماط. تعذر العثور على أنماط المكوّن داخل المحتوى المنسوخ."],"Unable to paste styles. Please allow browser clipboard permissions before continuing.":["غير قادر على لصق الأنماط. يرجى السماح بأذونات حافظة المتصفح قبل المتابعة."],"Unable to paste styles. This feature is only available on secure (https) sites in supporting browsers.":["غير قادر على لصق الأنماط. لا تتوفر هذه الميزة إلا على المواقع الآمنة (https) في المتصفحات الداعمة."],Tilde:Ke,"Template part":[],"Apply this block’s typography, spacing, dimensions, and color styles to all %s blocks.":["قم بتطبيق أسلوب الطباعة والتباعد والأبعاد والألوان لهذا المكوّن على جميع مكوّنات %s."],"Import widget area":["استيراد منطقة الودجة"],"Unable to import the following widgets: %s.":["غير قادر على استيراد الودجات التالية: %s."],"Widget area: %s":["منطقة الودجة: %s"],"Select widget area":["تحديد منطقة الودجة"],"Your %1$s file uses a dynamic value (%2$s) for the path at %3$s. However, the value at %3$s is also a dynamic value (pointing to %4$s) and pointing to another dynamic value is not supported. Please update %3$s to point directly to %4$s.":["يستخدم ملف ⁦%1$s⁩ الخاص بك قيمة ديناميكية (⁦%2$s⁩) للمسار في ⁦%3$s⁩. ومع ذلك، فإن القيمة في ⁦%3$s⁩ هي أيضًا قيمة ديناميكية (تشير إلى ⁦%4$s⁩) وتشير إلى قيمة ديناميكية أخرى غير مدعومة. يرجى تحديث ⁦%3$s⁩ للإشارة مباشرة إلى ⁦%4$s⁩."],"Clear Unknown Formatting":["تنظيف التنسيقات غير المعروفة"],CSS:_e,"Open %s styles in Styles panel":[],"Style Book":[],"Additional CSS":["تنسيقات (CSS) إضافية"],"Add your own CSS to customize the appearance and layout of your site.":["أضف تنسيقات الـ CSS الخاصة بك هنا لضبط وتخصيص مظهر وتخطيط موقعك."],"Open code editor":[],"Specify a fixed height.":[],"Block inspector tab display overrides.":[],"Markup is not allowed in CSS.":["وسوم التوصيف (Markup) غير مسموحة في تنسيقات الـ CSS."],"block keywordpage":["صفحة"],"block descriptionDisplays a page inside a list of all pages.":[],"block titlePage List Item":[],"Show details":["إظهار التفاصيل"],"Choose a page to show only its subpages.":["اختر صفحة لعرض صفحاتها الفرعية."],"Parent Page":[],"Media List":["قائمة الوسائط"],Videos:Ze,"Go to parent Navigation block":[],Fixed:et,"Fit contents.":[],"Specify a fixed width.":[],"Stretch to fill available space.":[],"Randomize colors":[],"Document Overview":["نظرة عامة على المستند"],"Convert the current paragraph or heading to a heading of level 1 to 6.":[],"Convert the current heading to a paragraph.":[],"Transform paragraph to heading.":["تحويل الفقرة إلى عنوان."],"Transform heading to paragraph.":[],"Extra Extra Large":["كبير جدًا جدًا"],"Group blocks together. Select a layout:":[],"Color randomizer":[],"Indicates whether the current theme supports block-based templates.":[],"untitled post %s":["مقالة بدون عنوان %s"],": %s":[": %s"],"Time to read:":["مدة القراءة:"],"Words:":["الكلمات:"],"Characters:":["الأحرف:"],"Navigate the structure of your document and address issues like empty or incorrect heading levels.":[],Decrement:tt,Increment:ot,"Remove caption":["إزالة التسمية"],"Close List View":[],"Choose a variation to change the look of the site.":["اختر شكلًا لتغيير مظهر الموقع."],"Write with calmness":["اكتب بهدوء"],"Distraction free":["بدون تشتيت الانتباه"],"Reduce visual distractions by hiding the toolbar and other elements to focus on writing.":["قلل المشتتات المرئية عن طريق إخفاء شريط الأدوات والعناصر الأخرى للتركيز على الكتابة."],Caption:st,Pattern:at,"Raw size value must be a string, integer or a float.":[],"Link author name to author page":["ربط اسم الكاتب إلى صفحة الكاتب"],"Not available for aligned text.":[],"There’s no content to show here yet.":[],"block titleComments Previous Page":["تعليقات الصفحة السابقة"],"block titleComments Next Page":["التعليقات الصفحة التالية"],"Arrow option for Next/Previous linkChevron":["شارة رتبة"],"Arrow option for Next/Previous linkArrow":["سهم"],"Arrow option for Next/Previous linkNone":["بدون"],"A decorative arrow for the next and previous link.":["سهم زخرفي للرابط التالي والسابق."],"Format tools":["أدوات الصيغة"],"Displays an archive with the latest posts of type: %s.":[],"Archive: %s":["الأرشيف :%s"],"Archive: %1$s (%2$s)":["أرشيف: %1$s (%2$s)"],handle:it,"Import Classic Menus":["استيراد القوائم الكلاسيكية"],"You are currently in zoom-out mode.":["أنت حالياً في وضع التصغير."],"$store must be an instance of WP_Style_Engine_CSS_Rules_Store_Gutenberg":[],'"%s" successfully created.':['تم إنشاء "%s" بنجاح.'],XXL:nt,"%1$s. Selected":["%1$s. المحدد"],"%1$s. Selected. There is %2$d event":["المُحدد %1$s. هناك %2$d حدث","المُحدد %1$s. هناك %2$d حدث واحد","المُحدد %1$s. هناك %2$d حدثان","المُحدد %1$s. هناك %2$d أحداث","المُحدد %1$s. هناك %2$d حدث","المُحدد %1$s. هناك %2$d حدث"],"View next month":["عرض الشهر المقبل"],"View previous month":["عرض الشهر الماضي"],"Archive type: Name":["نوع الأرشيف: الاسم"],"Show archive type in title":["إظهار نوع الأرشيف في العنوان"],"The Queen of Hearts.":["ملكة القلوب."],"The Mad Hatter.":["جنون حتر."],"The Cheshire Cat.":["قطة شيشاير."],"The White Rabbit.":["الأرنب الأبيض."],"Alice.":["اليس."],"Gather blocks in a container.":["جمع كتل في حاوية."],"Inner blocks use content width":["تستخدم المكوّنات الداخلية عرض المحتوى"],Font:rt,Constrained:lt,"Spacing control":[],"Custom (%s)":["مخصص (%s)"],"All sides":["جميع الجوانب"],"Disables custom spacing sizes.":["تعطيل أحجام التباعد المخصصة."],"All Authors":["كافة الكتّاب"],"No authors found.":["لم يتم العثور على كتّاب."],"Search Authors":["البحث في الكتّاب"],"Author: %s":["الكاتب: %s"],"Create template part":[],"Manage the fonts and typography used on headings.":["التحكم في الخطوط وأسلوب الطباعة المُستخدمة على العناوين"],H6:ct,H5:dt,H4:ut,H3:pt,H2:ht,H1:mt,"Select heading level":["تحديد مستوى العنوان"],"View site":["عرض الموقع"],"Display the search results title based on the queried object.":["عرض عنوان نتائج البحث استنادا إلى الكائن الذي تم الاستعلام عنه."],"Search Results Title":["عنوان نتائج البحث"],"Search results for: “search term”":["نتائج البحث عن: «مصطلح البحث»"],"Show search term in title":["عرض مصطلح البحث في العنوان"],Taxonomies:bt,"Show label":["إظهار التسمية"],"View options":["عرض الخيارات"],"Disables output of layout styles.":["يقوم بتعطيل ناتج أنماط التخطيط."],'Search results for: "%s"':['نتائج البحث عن: "%s"'],"Move %1$d blocks from position %2$d left by one place":["حرّك %1$d مكوّنات من الموضع %2$d إلى اليسار بمقدار موضع واحد"],"Move %1$d blocks from position %2$d down by one place":["حرّك %1$d مكوّنات من الموضع %2$d إلى الأسفل بمقدار موضع واحد"],"Suggestions list":["قائمة الاقتراحات"],"Set the width of the main content area.":["ضبط عرض منطقة المحتوى الرئيسية."],"Border color and style picker":["ملتقط لون ونمط الحدود"],"Switch to editable mode":["التبديل إلى الوضع القابل للتحرير"],"Blocks cannot be moved right as they are already are at the rightmost position":["لا يمكن تحريك المكوّنات إلى اليمين لأنها موجودة بالفعل في أقصى الموضع الأيمن"],"Blocks cannot be moved left as they are already are at the leftmost position":["لا يمكن نقل المكوّنات إلى اليسار لأنها موجودة بالفعل في أقصى اليسار"],"All blocks are selected, and cannot be moved":["تم تحديد جميع المكوّنات، ولا يمكن نقلها"],"Whether the V2 of the list block that uses inner blocks should be enabled.":[],"Post Comments Form block: Comments are not enabled for this item.":["مكوّن نموذج تعليقات المقال: التعليقات غير مُفعّلة لهذا العنصر."],"Time to read":["مدة القراءة"],"%s minute":[],"< 1 minute":["< 1 دقيقة"],"Apply suggested format: %s":["تطبيق التنسيق المقترح: %s"],"Custom template":["قالب مخصّص"],"Displays taxonomy: %s.":["عرض الفئة: %s."],Hover:gt,'Describe the template, e.g. "Post with sidebar". A custom template can be manually applied to any post or page.':['وصف القالب، مثلا. "مقالة مع شريط جانبي". يمكن تطبيق قالب مُخصص يدويًا على أي مقالة أو صفحة.'],"Change date: %s":["تاريخ التغيير: %s"],"short date format without the yearM j":["M j"],"Apply to all blocks inside":["تنطبق على جميع المكوّنات داخل"],"Active theme spacing scale.":["مقياس تباعد القوالب النشطة."],"Active theme spacing sizes.":["أحجام تباعد القوالب النشطة."],"%sX-Large":["%s كبيرا جداً"],"%sX-Small":["%s صغير جداً"],"Some of the theme.json settings.spacing.spacingScale values are invalid":[],"post schedule date format without yearF j g:i a":[],"Tomorrow at %s":["غدا في تمام الساعة %s"],"post schedule time formatg:i a":["g:i a"],"Today at %s":["اليوم في تمام الساعة %s"],"post schedule full date formatF j, Y g:i a":[],"Displays a single item: %s.":["عرض عنصر مفرد: %s."],"Single item: %s":["عنصر فردي: %s"],"This template will be used only for the specific item chosen.":["سيتم تطبيق هذا القالب للعناصر المختارة حصراً."],"For a specific item":["لعنصر معين"],"For all items":["لجميع العناصر"],"Select whether to create a single template for all items or a specific one.":["حدد ما إذا كنت تريد إنشاء منوال واحد لكل العناصر أو منوال معين."],"Manage the fonts and typography used on buttons.":["التحكم في الخطوط وأسلوب الطباعة المُستخدمة على الأزرار"],"Edit template":["تحرير المنوال"],"Templates define the way content is displayed when viewing your site.":["تحدد المناويل طريقة عرض المحتوى عند عرض موقعك."],"Make the selected text inline code.":["اجعل النص المحدد رمزا مضمنا."],"Strikethrough the selected text.":[],Unset:yt,"action that affects the current postEnable comments":["تفعيل التعليقات"],"Embed a podcast player from Pocket Casts.":["تضمين مشغل بودكاست من Pocket Casts."],"66 / 33":["66 / 33"],"33 / 66":["33 / 66"],"Nested blocks will fill the width of this container.":[],"Nested blocks use content width with options for full and wide widths.":[],"Copy all blocks":["نسخ المكوّنات"],"Overlay opacity":["عتامة الغِشاء"],"Get started here":["إبدأ من هنا"],"Interested in creating your own block?":["هل أنت مهتم بإنشاء المكوّن الخاصة بك؟"],Now:kt,"Always open List View":[],"Opens the List View panel by default.":[],"Start adding Heading blocks to create a table of contents. Headings with HTML anchors will be linked here.":["ابدأ في إضافة مكوِّنات العناوين لإنشاء جدول محتويات. سيتم هنا ربط العناوين التي تحتوي على نقاط ارتساء HTML."],"Only including headings from the current page (if the post is paginated).":[],"Only include current page":["قم بتضمين الصفحة الحالية فقط"],"Convert to static list":["تحويل إلى قائمة ثابتة"],Parents:ft,"Commenter avatars come from Gravatar.":["الصورة الرمزية للمُعلِق تأتي من Gravatar."],"Links are disabled in the editor.":["الروابط مُعطلة في المحرر."],"%s response":[],"%1$s response to %2$s":[],"“%s”":["“%s”"],"block titleComments":["التعليقات"],"Control how this post is viewed.":["التحكم في كيفية عرض هذه المقالة"],"All options reset":["إعادة تعيين جميع الخيارات"],"All options are currently hidden":["جميع الخيارات مخفية حاليًا"],"%s is now visible":["%s مرئي الآن"],"%s hidden and reset to default":["%s مخفي واعادة تعيينه للافتراضي"],"%s reset to default":["%s إعادة التعيين إلى الوضع المبدئي"],Suffix:wt,Prefix:vt,"If there are any Custom Post Types registered at your site, the Content block can display the contents of those entries as well.":[],"That might be a simple arrangement like consecutive paragraphs in a blog post, or a more elaborate composition that includes image galleries, videos, tables, columns, and any other block types.":["قد يكون هذا ترتيبًا بسيطًا مثل فقرات متتالية في مقال، أو تكوين أكثر تفصيلاً يتضمن معارض الصور ومقاطع الفيديو والجداول والأعمدة وأي أنواع مكوِّنات أخرى."],"This is the Content block, it will display all the blocks in any single post or page.":[],"Post Comments Form block: Comments are not enabled.":["مكوّن نموذج تعليقات المقال: التعليقات غير مُفعّلة."],"To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.":["للبدء في إدارة التعليقات وتحريرها وحذفها، يرجى زيارة شاشة التعليقات في لوحة التحكم."],"Hi, this is a comment.":["مرحباً، هذا تعليق."],"January 1, 2000 at 00:00 am":["1 يناير، 2000 الساعة 00:00 ص"],says:St,"A WordPress Commenter":["مُعلِق ووردبريس"],"Leave a Reply":["اترك تعليقاً"],"Response to %s":["الرد على %s"],Response:Ct,"Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved.":["تعليقك في انتظار المراجعة. هذه معاينة؛ سيكون تعليقك مرئيًا بعد الموافقة عليه."],"Your comment is awaiting moderation.":["تعليقك في انتظار المراجعة."],"block descriptionDisplays a title with the number of comments.":[],"block titleComments Title":["عنوان التعليقات"],"These changes will affect your whole site.":["ستؤثّر هذه التغييرات على موقعك بأكمله."],"Responses to %s":["الردود على %s"],"One response to %s":["رد واحد على %s"],"“Post Title”":['"عنوان المقالة"'],"Show comments count":["إظهار عدد التعليقات"],"Show post title":["عرض عنوان المشاركه"],"Comments Pagination block: paging comments is disabled in the Discussion Settings":["كتلة ترقيم صفحات التعليقات: تم تعطيل ترحيل صفحات التعليقات في إعدادات المناقشة"],Responses:Tt,"One response":["رد واحد"],"block descriptionGather blocks in a layout container.":["تجميع المكوّنات في حاوية تخطيط."],"block descriptionAn advanced block that allows displaying post comments using different visual configurations.":["مكوّن متقدم يسمح لك باستعراض تعليقات المقالة باستخدام إعدادات مرئية مختلفة."],"block descriptionDisplays the date on which the comment was posted.":["يعرض التاريخ الذي تم نشر التعليق فيه."],"block descriptionDisplays the name of the author of the comment.":["إظهار اسم كاتب التعليق."],"block descriptionThis block is deprecated. Please use the Avatar block instead.":[],"block titleComment Author Avatar (deprecated)":[],"This Navigation Menu is empty.":[],"Browse styles":["تصفح الأنماط"],"Bottom border":["الحدّ السفلي"],"Right border":["الحدّ الأيمن"],"Left border":["الحدّ الأيسر"],"Top border":["الحدّ العلويّ"],"Border color picker.":["ملتقط لون الحدود"],"Border color and style picker.":["ملتقط لون ونمط الحدود"],"Link sides":["ربط الجوانب"],"Unlink sides":["إلغاء ربط الجوانب"],"Quote citation":["كتابة استشهاد"],"Choose a pattern for the query loop or start blank.":["يرجى اختيار تأليفة جاهزة لحلقة الاستعلام أو البدأ فارغاً!"],"Navigation Menu successfully deleted.":[],"Arrange blocks vertically.":["ترتيب المكوّنات عمودياً."],Stack:At,"Arrange blocks horizontally.":["تريبت المكوّنات أفقياً."],"Use featured image":["استخدام الصورة البارزة"],Week:Pt,"Group by":[],"Delete selection.":["حذف التحديد."],"Transform to %s":["تحويل إلى %s"],"single horizontal lineRow":["صف"],"Select parent block: %s":[],"Alignment optionNone":["بدون"],"Whether the V2 of the quote block that uses inner blocks should be enabled.":["ما إذا كان يجب تمكين ن2 من مكوّن الاقتباس الذي يستخدم مكوّنات داخلية."],"Adding an RSS feed to this site’s homepage is not supported, as it could lead to a loop that slows down your site. Try using another block, like the Latest Posts block, to list posts from the site.":["ميزة إضافة تغذية RSS إلى الصفحة الرئيسية لهذا الموقع غير مدعومة، إذ من الممكن أن تؤدي إلى حلقة تبطئ موقعك. حاول استخدام مكوّن آخر، مثل Block أحدث المقالات، لإدراج المقالات من الموقع."],"block descriptionContains the block elements used to render content when no query results are found.":["يحتوي على عناصر المكوّن المستخدمة لمعالجة المحتوى عند عدم العثور على نتائج استعلام."],"block titleNo Results":[],"block titleList Item":[],"block descriptionAdd a user’s avatar.":["إضافة الصورة الرمزية للمستخدم."],"block titleAvatar":["الصورة الرمزية"],"View Preview":["مشاهدة المعاينة"],"Download your theme with updated templates and styles.":["احصل على نسخة محدثة من القوالب والتنسيقات الخاصة بك."],'Custom color picker. The currently selected color is called "%1$s" and has a value of "%2$s".':['لاقط اللون المخصص. اللون المختار حاليًا يسمى "%1$s" ولديه القيمة %2$s".'],"Largest size":["أكبر حجم"],"Smallest size":["أصغر حجم"],"Add text or blocks that will display when a query returns no results.":["أضف نصوصًا أو مكوّنات من شأنها أن تظهر عندما لا يُرجع الاستعلام أي نتائج."],"Featured image: %s":["الصورة البارزة: %s"],"Link to post":["ربط بالمقال"],Invalid:xt,"Link to user profile":["رابط للملف الشخصي للعضو"],"Select the avatar user to display, if it is blank it will use the post/page author.":["حدد المستخدم المراد عرض الصورة الرمزية الخاصة به، اذا تمّ ترك هذا الحقل فارغًا فإنّه سيتمّ تعيين الصورة الرمزية للناشر/الكاتب لهذا المحتوى بشكل افتراضي."],"Default Avatar":["الصورة الرمزية المبدئية"],"Enter a date or time format string.":["أدخل صيغة التاريخ أو الوقت."],"Custom format":["تنسيق مخصص"],"Choose a format":["اختيار صيغة"],"Enter your own date format":["ادخال صيغة التاريخ الخاصة بك"],"long date formatF j, Y":["j F، Y"],"medium date format with timeM j, Y g:i A":[],"medium date formatM j, Y":[],"short date format with timen/j/Y g:i A":[],"short date formatn/j/Y":[],"Default format":["التنسيق المبدئي"],Lock:$t,Unlock:Dt,"Lock all":["قفل الكل"],"Lock %s":["قفل %s"],"(%s website link, opens in a new tab)":["(رابط الموقع الإلكتروني لـ %s، يُفتح في تبويب جديد)"],"(%s author archive, opens in a new tab)":["(أرشيف الكاتب %s، يفتح في تبويب جديد)"],"Preference activated - %s":["تم تفعيل التفضيل - %s"],"Preference deactivated - %s":["تم الغاء تفعيل التفضيل - %s"],"Insert a link to a post or page.":["إدراج رابط لمقالة أو صفحة."],"Classic menu import failed.":["فشل في استيراد القائمة الكلاسيكية."],"Classic menu imported successfully.":["تم استيراد القائمة الكلاسيكية بنجاح."],"Classic menu importing.":["استيراد القائمة التقليدية."],"Failed to create Navigation Menu.":["فشل في إنشاء قائمة تنقّل."],"Navigation Menu successfully created.":["تم إنشاء قائمة التنقل بنجاح."],"Creating Navigation Menu.":["جار إنشاء قائمة تنقل."],'Unable to create Navigation Menu "%s".':['غير قادر على إنشاء قائمة التنقل "%s".'],'Unable to fetch classic menu "%s" from API.':['غير قادر على جلب القائمة التقليدية "%s" من واجهة برمجة التطبيقات (API).'],"Navigation block setup options ready.":["خيارات إعداد مكوّن التنقل جاهزة."],"Loading navigation block setup options…":[],"Choose a %s":["تحديد الـ%s"],"Existing template parts":["أجزاء القالب الموجودة"],"Convert to Link":["تحويل إلى رابط"],"%s blocks deselected.":["تم إلغاء تحديد %s مكوّن."],"%s deselected.":["%s غير محدد."],"block descriptionDisplays the link of a post, page, or any other content-type.":["إظهار رابط لمقالة أو لصفحة أو لأي نوع محتوى آخر."],"block titleRead More":["اقرأ المزيد"],"block descriptionThe author biography.":["النبذة التعريفيّة للكاتب."],"block titleAuthor Biography":["سيرة الكاتب"],'The "%s" plugin has encountered an error and cannot be rendered.':['لقد واجهت الإضافة "%s" خطأ ولا يمكن معاينته.'],"The posts page template cannot be changed.":["لا يمكن تغيير قالب صفحة المقالات."],"Author Biography":["النبذة التعريفيّة للكاتب"],"Create from '%s'":["إنشاء من '%s'"],"Older comments page link":["رابط صفحة التعليقات الأقدم"],"If you take over, the other user will lose editing control to the post, but their changes will be saved.":["إذا توليت زمام الأمور، سيفقد المستخدم الآخر التحكم في تحرير المقالة، ولكن سيتم حفظ التغييرات التي أجروها."],"Select the size of the source image.":["تحديد حجم الصورة المصدر."],"Configure the visual appearance of the button that toggles the overlay menu.":[],"Show icon button":["إظهار زر الأيقونة"],"font weightBlack":["أسود"],"font weightExtra Bold":["سميك جداً"],"font weightBold":["سميك"],"font weightSemi Bold":["شبه سميك"],"font weightMedium":["متوسط"],"font weightRegular":["عادي"],"font weightLight":["فاتح"],"font weightExtra Light":["رفيع جدًا"],"font weightThin":["رفيع"],"font styleItalic":["مائل"],"font styleRegular":["عادي"],"Transparent text may be hard for people to read.":["قد يكون النص الشفاف صعبا على القراءة."],"Sorry, you are not allowed to view this global style.":["عذرًا، غير مسموح لك بعرض هذا التنسيق العام."],"Sorry, you are not allowed to edit this global style.":["عذرًا، غير مسموح لك بتحرير هذا التنسيق العام."],"Older Comments":["التعليقات القديمة"],"Newer Comments":["تعليقات جديدة"],"block descriptionDisplay post author details such as name, avatar, and bio.":["عرض تفاصيل كاتب المقالة مثل الاسم، الصورة الرمزية، والنبذة التعريفيّة."],"Categories provide a helpful way to group related posts together and to quickly tell readers what a post is about.":["توفر التصنيفات طريقة مفيدة لتجميع المقالات ذات الصلة معًا ولإخبار القراء بسرعة عن موضوع المقالة."],"Assign a category":["إسناد تصنيف"],"%s is currently working on this post (), which means you cannot make changes, unless you take over.":["%s يعمل حاليًا على هذه المقالة ()، مما يعني أنه لا يمكنك إجراء تغييرات، إلا إذا توليت المهمة."],preview:Lt,"%s now has editing control of this post (). Don’t worry, your changes up to this moment have been saved.":["%s لديه التحكم حاليًا في تحرير هذه المقالة (). لا داعي للقلق، فقد تم حفظ تغييراتك حتى هذه اللحظة."],"Exit editor":["الخروج من المحرر"],"Draft saved.":["تم حفظ المسودة."],"site exporter menu itemExport":["تصدير"],"Close Block Inserter":[],"Page List: Cannot retrieve Pages.":["قائمة الصفحات: لا يمكن استرداد الصفحات."],"Link is empty":["الرابط فارغ"],"Button label to reveal tool panel options%s options":["خيارات الـ %s"],"Search %s":["البحث في %s"],"Set custom size":["تعيين حجم مخصص"],"Use size preset":["استخدام الحجم المحدد مسبقاً"],"Reset colors":["إعادة تعيين الألوان"],"Reset gradient":["إعادة تعيين التدرج"],"Remove all colors":["إزالة كل الألوان"],"Remove all gradients":["إزالة كل التدرجات"],"Color options":["خيارات الألوان"],"Gradient options":["خيارات التدرج"],"Add color":["إضافة لون"],"Add gradient":["إضافة تدرج"],Done:Nt,"Gradient name":["اسم التدرج"],"Color %d":[],"Color format":["تنسيق الألوان"],"Hex color":["لون سداسي"],"block descriptionThe author name.":["اسم الكاتب."],"block titleAuthor Name":["اسم الكاتب"],"block descriptionDisplays the previous comment's page link.":["إظهار رابط صفحة التعليقات السابقة."],"block descriptionDisplays the next comment's page link.":["إظهار رابط صفحة التعليقات التالية."],Icon:Mt,Delete:Et,"Icon background":["أيقونة الخلفية"],"Use as Site Icon":[],"Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. To use a custom icon that is different from your site logo, use the Site Icon settings.":["أيقونات الموقع هي ماتراه في علامات تبويب المتصفح، وأشرطة الإشارات المرجعية، وداخل تطبيقات ووردبريس للجوال. لاستخدام أيقونة مخصصة مختلفة عن شعار موقعك، استخدم إعدادات أيقونة الموقع."],"Post type":["نوع المشاركة"],"Link to author archive":["رابط أرشيف الكاتب"],"Author Name":["اسم الكاتب"],"You do not have permission to create Navigation Menus.":["ليست لديك صلاحية إنشاء قوائم التنقل."],"You do not have permission to edit this Menu. Any changes made will not be saved.":["ليست لديك صلاحية لتحرير هذه القائمة. لن يتم حفظ أي من التغييرات التي تم إجراؤها."],"Newer comments page link":["رابط صفحة التعليقات الأحدث"],"Site icon.":["أيقونة الموقع."],"Font size nameExtra Large":["كبير جدًا"],"block titlePagination":["تعدد الصفحات"],"block titlePrevious Page":["الصفحة السابقة"],"block titlePage Numbers":["أرقام الصفحات"],"block titleNext Page":["الصفحة التالية"],"block descriptionDisplays a list of page numbers for comments pagination.":["إظهار قائمة بأرقام صفحات التعليقات."],"Site updated.":["تم تحديث الموقع"],"Saving failed.":["فشلت عملية الحفظ."],"https://wordpress.org/documentation/article/styles-overview/":["https://wordpress.org/support/article/styles-overview/"],"An error occurred while creating the site export.":["حدث خطأ أثناء تصدير الموقع."],"Manage menus":["إدارة القوائم"],"%s submenu":["القائمة الفرعية لـ %s"],"block descriptionDisplays a paginated navigation to next/previous set of comments, when applicable.":["يعرض قائمة تنقل ذات صفحات مرقمة إلى مجموعة التعليقات التالية/السابقة، عند الاقتضاء."],"block titleComments Pagination":["ترقيم التعليقات"],Actions:It,"An error occurred while restoring the post.":["حدث خطأ أثناء استعادة المقالة."],Rename:Rt,"An error occurred while setting the homepage.":[],"An error occurred while creating the template part.":["حدث خطأ أثناء إنشاء جزء القالب."],"An error occurred while creating the template.":["حدث خطأ أثناء إنشاء القالب."],"Manage the fonts and typography used on the links.":["إدارة الخطوط المستخدمة على الروابط."],"Manage the fonts used on the site.":["إدارة الخطوط المستخدمة في الموقع."],Aa:Bt,"An error occurred while deleting the item.":[],"Show arrow":["إظهار السهم"],"Arrow option for Comments Pagination Next/Previous blocksChevron":["شارة رتبة"],"Arrow option for Comments Pagination Next/Previous blocksArrow":["سهم"],"Arrow option for Comments Pagination Next/Previous blocksNone":["بدون"],"A decorative arrow appended to the next and previous comments link.":["سهم مزخرف ملحق بروابط التعليقات التالية والسابقة."],"Indicates this palette is created by the user.Custom":["مُخصص"],"Indicates this palette comes from WordPress.Default":["افتراضي"],"Indicates this palette comes from the theme.Theme":["قالب"],"Add default block":["إضافة مكوّن افتراضي"],"Whether a template is a custom template.":[],"Unable to open export file (archive) for writing.":["تعذر فتح ملف التصدير (الأرشيف) للكتابة."],"Zip Export not supported.":["تصدير ZIP غير مدعوم."],"Displays latest posts written by a single author.":["إظهار أحدث المقالات المنشورة بواسطة كاتب واحد."],"Here’s a detailed guide to learn how to make the most of it.":["هذا دليل تفصيلي حول كيفية الإستفادة القصوى منها."],"New to block themes and styling your site?":[],"You can adjust your blocks to ensure a cohesive experience across your site — add your unique colors to a branded Button block, or adjust the Heading block to your preferred size.":["يمكنك تعديل المكوّنات الخاصة بك لضمان تجربة متماسكة عبر موقعك — ​​أضف ألوانك الفريدة إلى مكوّن زر ذات علامة تجارية، أو عدّل مكوّن العنوان إلى الحجم المفضل لديك."],"Personalize blocks":["تخصيص المكوّنات"],"You can customize your site as much as you like with different colors, typography, and layouts. Or if you prefer, just leave it up to your theme to handle!":[],"Set the design":["حدد التصميم"],"Tweak your site, or give it a whole new look! Get creative — how about a new color palette for your buttons, or choosing a new font? Take a look at what you can do here.":["اضبط موقعك، أو أعطه مظهرًا جديدًا كلياً — ما رأيك بلائحة ألوان جديدة للأزرار، أو اختيار نوع خط جديد؟ ألقِ نظرة على ما يمكنك فعله هنا."],"Welcome to Styles":["مرحبًا بك في التنسيقات"],styles:Ft,"Click to start designing your blocks, and choose your typography, layout, and colors.":["انقر على للبدء بتصميم المكوّنات واختيار الخطوط والتخطيط والألوان."],"Design everything on your site — from the header right down to the footer — using blocks.":["صمم كل شيء على موقعك - من الترويسة إلى التذييل - باستخدام المكوّنات."],"Edit your site":["تحرير الموقع"],"Welcome to the site editor":["مرحبًا بك في مُحرّر الموقع"],"Add a featured image":["إضافة صورة بارزة"],"block descriptionThis block is deprecated. Please use the Comments block instead.":[],"block titleComment (deprecated)":[],"block descriptionShow a block pattern.":["عرض نمط لـ مكوّن."],"block titlePattern":["نمط"],"block keywordequation":[],"block descriptionAn advanced block that allows displaying taxonomy terms based on different query parameters and visual configurations.":[],"block descriptionContains the block elements used to display a comment, like the title, date, author, avatar and more.":["يحتوي على عناصر المكوِّن المُستخدمة لعرض تعليق، مثل العنوان والتاريخ والكاتب والصورة الرمزية والمزيد."],"block titleComment Template":["قالب التعليقات"],"block descriptionDisplays a link to reply to a comment.":["يعرض رابط للرد على تعليق."],"block titleComment Reply Link":["رابط الرد على التعليقات"],"block descriptionDisplays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.":["يعرض رابط لتحرير التعليق في لوحة تحكم ووردبريس. هذا الرابط مرئي فقط للمستخدمين الذين يمتلكون صلاحية تحرير التعليق."],"block titleComment Edit Link":["رابط تحرير التعليق"],"block descriptionDisplays the contents of a comment.":["إظهار محتوى التعليق."],"block titleComment Author Name":["اسم كاتب التعليق"],"%s applied.":["%s تم تطبيقها."],"%s removed.":["تم إزالة %s."],"%s: Sorry, you are not allowed to upload this file type.":["%s: عذراً، غير مسموح لك بتحميل هذا النوع من الملفات."],"This change will affect your whole site.":["سيؤثر هذا التغيير على موقعك بالكامل."],"Use left and right arrow keys to resize the canvas.":["استخدم مفاتيح الأسهم الأيمن والأيسر لتغيير حجم اللوحة."],"Drag to resize":["اسحب لتغيير الحجم"],"Submenu & overlay background":["خلفية القائمة الفرعية والغِشاء"],"Submenu & overlay text":["نص القائمة الفرعية والغِشاء"],"Create new Menu":[],"Unsaved Navigation Menu.":[],Menus:zt,"Open List View":[],"Embed Wolfram notebook content.":["تضمين محتوى دفتر Wolfram."],Reply:Ut,"Displays more block tools":["إظهار المزيد من أدوات المكوّن"],"Create a two-tone color effect without losing your original image.":["إنشاء تأثير لوني بدرجتين دون أن تفقد صورتك الأصلية."],"Remove %s":["إزالة %s"],"Explore all patterns":["استكشاف كل الأنماط"],"Allow to wrap to multiple lines":["السماح للالتفاف إلى خطوط متعددة"],"No Navigation Menus found.":[],"Theme not found.":["القالب غير موجود"],"HTML title for the post, transformed for display.":["عنوان HTML للمقالة، مُعد للعرض."],"Title for the global styles variation, as it exists in the database.":["عنوان مجموعة التنسيقات العامة، كما هو موجود في قاعدة البيانات."],"Title of the global styles variation.":["عنوان مجموعة التنسيقات العامة."],"Global settings.":["الإعدادات العامة."],"Global styles.":["تنسيقات عامة."],"ID of global styles config.":["مُعرِّف إعداد التنسيقات العامة."],"No global styles config exist with that id.":["لا توجد تنسيقات عامة متوفر لها إعدادات مع هذا المُعرّف."],"Sorry, you are not allowed to access the global styles on this site.":["عذرًا، غير مسموح لك بالوصول إلى التنسيقات العامة على هذا الموقع."],"The theme identifier":["مُعرف القالب"],"%s Avatar":["%s الصورة الرمزية"],"block style labelPlain":["عادي"],Elements:Vt,"Customize the appearance of specific blocks and for the whole site.":["تخصيص مظهر مكوّنات محددة ولكامل الموقع."],"Link to comment":["رابط للتعليق"],"Link to authors URL":["رابط للكتاب URL"],"Choose an existing %s or create a new one.":["إختار %s موجود أو انشئ واحد جديد."],"Show icon":[],"Open on click":["فتح عند النقر"],Submenus:Wt,Always:Ht,"Collapses the navigation options in a menu icon opening an overlay.":["طيّ خيارات التنقل في أيقونة قائمة تفتح كـ غِشاء."],"Configure overlay menu":["تهيئة قائمة الغِشاء"],"Overlay Menu":["قائمة الغِشاء"],Display:Gt,"Embed Pinterest pins, boards, and profiles.":["تضمين دبابيس Pinterest، اللوحات والملفات الشخصية."],bookmark:Ot,"block descriptionDisplays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.":["عرض اسم الموقع. قم بتحديث المكوّن، وسيتم تطبيق التغييرات في كل مكان تم استخدامه فيه. يظهر هذا أيضًا في شريط عنوان المتصفح وفي نتائج البحث."],Highlight:Yt,"Create page: %s":["إنشاء صفحة: %s"],"You do not have permission to create Pages.":["ليس لديك صلاحية إنشاء صفحات."],Palette:qt,"Include the label as part of the link":["إضافة التسمية كجزء من الرابط"],"Previous: ":["السابق:"],"Next: ":["التالي:"],"Make title link to home":["جعل رابط العنوان يشير الصفحة الرئيسة"],"Block spacing":["تباعد المكوَنات"],"Max %s wide":["أقصى عرض %s"],"label before the title of the previous postPrevious:":["السابق:"],"label before the title of the next postNext:":["التالي:"],"block descriptionAdd a submenu to your navigation.":["أضف قائمة فرعية لقائمة التصفّح الخاص بك."],"block titleSubmenu":["القائمة الفرعية"],"block descriptionDisplay content in multiple columns, with blocks added to each column.":["عرض المحتوى في عدة أعمدة، من خلال إضافة مكوّنات لكل عمود."],"Customize the appearance of specific blocks for the whole site.":["تخصيص مظهر مكوّنات محددة لكامل الموقع."],Colors:jt,"Hide and reset %s":["إخفاء وإعادة تعيين %s"],"Reset %s":["إعادة تعيين %s"],"The