re && static::has_same_registered_blocks( 'core' ) ) { return static::$core; } $config = static::read_json_file( __DIR__ . '/theme.json' ); $config = static::translate( $config ); /** * Filters the default data provided by WordPress for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_default', new WP_Theme_JSON_Data( $config, 'default' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$core = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$core = new WP_Theme_JSON( $config, 'default' ); } return static::$core; } /** * Checks whether the registered blocks were already processed for this origin. * * @since 6.1.0 * * @param string $origin Data source for which to cache the blocks. * Valid values are 'core', 'blocks', 'theme', and 'user'. * @return bool True on success, false otherwise. */ protected static function has_same_registered_blocks( $origin ) { // Bail out if the origin is invalid. if ( ! isset( static::$blocks_cache[ $origin ] ) ) { return false; } $registry = WP_Block_Type_Registry::get_instance(); $blocks = $registry->get_all_registered(); // Is there metadata for all currently registered blocks? $block_diff = array_diff_key( $blocks, static::$blocks_cache[ $origin ] ); if ( empty( $block_diff ) ) { return true; } foreach ( $blocks as $block_name => $block_type ) { static::$blocks_cache[ $origin ][ $block_name ] = true; } return false; } /** * Returns the theme's data. * * Data from theme.json will be backfilled from existing * theme supports, if any. Note that if the same data * is present in theme.json and in theme supports, * the theme.json takes precedence. * * @since 5.8.0 * @since 5.9.0 Theme supports have been inlined and the `$theme_support_data` argument removed. * @since 6.0.0 Added an `$options` parameter to allow the theme data to be returned without theme supports. * @since 6.6.0 Add support for 'default-font-sizes' and 'default-spacing-sizes' theme supports. * Added registration and merging of block style variations from partial theme.json files and the block styles registry. * * @param array $deprecated Deprecated. Not used. * @param array $options { * Options arguments. * * @type bool $with_supports Whether to include theme supports in the data. Default true. * } * @return WP_Theme_JSON Entity that holds theme data. */ public static function get_theme_data( $deprecated = array(), $options = array() ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __METHOD__, '5.9.0' ); } $options = wp_parse_args( $options, array( 'with_supports' => true ) ); if ( null === static::$theme || ! static::has_same_registered_blocks( 'theme' ) ) { $wp_theme = wp_get_theme(); $theme_json_file = $wp_theme->get_file_path( 'theme.json' ); if ( is_readable( $theme_json_file ) ) { $theme_json_data = static::read_json_file( $theme_json_file ); $theme_json_data = static::translate( $theme_json_data, $wp_theme->get( 'TextDomain' ) ); } else { $theme_json_data = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA ); } /* * Register variations defined by theme partials (theme.json files in the styles directory). * This is required so the variations pass sanitization of theme.json data. */ $variations = static::get_style_variations( 'block' ); wp_register_block_style_variations_from_theme_json_partials( $variations ); /* * Source variations from the block registry and block style variation files. Then, merge them into the existing theme.json data. * * In case the same style properties are defined in several sources, this is how we should resolve the values, * from higher to lower priority: * * - styles.blocks.blockType.variations from theme.json * - styles.variations from theme.json * - variations from block style variation files * - variations from block styles registry * * See test_add_registered_block_styles_to_theme_data and test_unwraps_block_style_variations. * */ $theme_json_data = static::inject_variations_from_block_style_variation_files( $theme_json_data, $variations ); $theme_json_data = static::inject_variations_from_block_styles_registry( $theme_json_data ); /** * Filters the data provided by the theme for global styles and settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_theme', new WP_Theme_JSON_Data( $theme_json_data, 'theme' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$theme = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$theme = new WP_Theme_JSON( $config ); } if ( $wp_theme->parent() ) { // Get parent theme.json. $parent_theme_json_file = $wp_theme->parent()->get_file_path( 'theme.json' ); if ( $theme_json_file !== $parent_theme_json_file && is_readable( $parent_theme_json_file ) ) { $parent_theme_json_data = static::read_json_file( $parent_theme_json_file ); $parent_theme_json_data = static::translate( $parent_theme_json_data, $wp_theme->parent()->get( 'TextDomain' ) ); $parent_theme = new WP_Theme_JSON( $parent_theme_json_data ); /* * Merge the child theme.json into the parent theme.json. * The child theme takes precedence over the parent. */ $parent_theme->merge( static::$theme ); static::$theme = $parent_theme; } } } if ( ! $options['with_supports'] ) { return static::$theme; } /* * We want the presets and settings declared in theme.json * to override the ones declared via theme supports. * So we take theme supports, transform it to theme.json shape * and merge the static::$theme upon that. */ $theme_support_data = WP_Theme_JSON::get_from_editor_settings( get_classic_theme_supports_block_editor_settings() ); if ( ! wp_theme_has_theme_json() ) { /* * Unlike block themes, classic themes without a theme.json disable * default presets when custom preset theme support is added. This * behavior can be overridden by using the corresponding default * preset theme support. */ $theme_support_data['settings']['color']['defaultPalette'] = ! isset( $theme_support_data['settings']['color']['palette'] ) || current_theme_supports( 'default-color-palette' ); $theme_support_data['settings']['color']['defaultGradients'] = ! isset( $theme_support_data['settings']['color']['gradients'] ) || current_theme_supports( 'default-gradient-presets' ); $theme_support_data['settings']['typography']['defaultFontSizes'] = ! isset( $theme_support_data['settings']['typography']['fontSizes'] ) || current_theme_supports( 'default-font-sizes' ); $theme_support_data['settings']['spacing']['defaultSpacingSizes'] = ! isset( $theme_support_data['settings']['spacing']['spacingSizes'] ) || current_theme_supports( 'default-spacing-sizes' ); /* * Shadow presets are explicitly disabled for classic themes until a * decision is made for whether the default presets should match the * other presets or if they should be disabled by default in classic * themes. See https://github.com/WordPress/gutenberg/issues/59989. */ $theme_support_data['settings']['shadow']['defaultPresets'] = false; // Allow themes to enable link color setting via theme_support. if ( current_theme_supports( 'link-color' ) ) { $theme_support_data['settings']['color']['link'] = true; } // Allow themes to enable all border settings via theme_support. if ( current_theme_supports( 'border' ) ) { $theme_support_data['settings']['border']['color'] = true; $theme_support_data['settings']['border']['radius'] = true; $theme_support_data['settings']['border']['style'] = true; $theme_support_data['settings']['border']['width'] = true; } // Allow themes to enable appearance tools via theme_support. if ( current_theme_supports( 'appearance-tools' ) ) { $theme_support_data['settings']['appearanceTools'] = true; } } $with_theme_supports = new WP_Theme_JSON( $theme_support_data ); $with_theme_supports->merge( static::$theme ); return $with_theme_supports; } /** * Gets the styles for blocks from the block.json file. * * @since 6.1.0 * * @return WP_Theme_JSON */ public static function get_block_data() { $registry = WP_Block_Type_Registry::get_instance(); $blocks = $registry->get_all_registered(); if ( null !== static::$blocks && static::has_same_registered_blocks( 'blocks' ) ) { return static::$blocks; } $config = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA ); foreach ( $blocks as $block_name => $block_type ) { if ( isset( $block_type->supports['__experimentalStyle'] ) ) { $config['styles']['blocks'][ $block_name ] = static::remove_json_comments( $block_type->supports['__experimentalStyle'] ); } if ( isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] ) && ! isset( $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] ) ) { /* * Ensure an empty placeholder value exists for the block, if it provides a default blockGap value. * The real blockGap value to be used will be determined when the styles are rendered for output. */ $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] = null; } } /** * Filters the data provided by the blocks for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_blocks', new WP_Theme_JSON_Data( $config, 'blocks' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$blocks = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$blocks = new WP_Theme_JSON( $config, 'blocks' ); } return static::$blocks; } /** * When given an array, this will remove any keys with the name `//`. * * @since 6.1.0 * * @param array $input_array The array to filter. * @return array The filtered array. */ private static function remove_json_comments( $input_array ) { unset( $input_array['//'] ); foreach ( $input_array as $k => $v ) { if ( is_array( $v ) ) { $input_array[ $k ] = static::remove_json_comments( $v ); } } return $input_array; } /** * Returns the custom post type that contains the user's origin config * for the active theme or an empty array if none are found. * * This can also create and return a new draft custom post type. * * @since 5.9.0 * * @param WP_Theme $theme The theme object. If empty, it * defaults to the active theme. * @param bool $create_post Optional. Whether a new custom post * type should be created if none are * found. Default false. * @param array $post_status_filter Optional. Filter custom post type by * post status. Default `array( 'publish' )`, * so it only fetches published posts. * @return array Custom Post Type for the user's origin config. */ public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) { if ( ! $theme instanceof WP_Theme ) { $theme = wp_get_theme(); } /* * Bail early if the theme does not support a theme.json. * * Since wp_theme_has_theme_json() only supports the active * theme, the extra condition for whether $theme is the active theme is * present here. */ if ( $theme->get_stylesheet() === get_stylesheet() && ! wp_theme_has_theme_json() ) { return array(); } $user_cpt = array(); $post_type_filter = 'wp_global_styles'; $stylesheet = $theme->get_stylesheet(); $args = array( 'posts_per_page' => 1, 'orderby' => 'date', 'order' => 'desc', 'post_type' => $post_type_filter, 'post_status' => $post_status_filter, 'ignore_sticky_posts' => true, 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'wp_theme', 'field' => 'name', 'terms' => $stylesheet, ), ), ); $global_style_query = new WP_Query(); $recent_posts = $global_style_query->query( $args ); if ( count( $recent_posts ) === 1 ) { $user_cpt = get_object_vars( $recent_posts[0] ); } elseif ( $create_post ) { $cpt_post_id = wp_insert_post( array( 'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }', 'post_status' => 'publish', 'post_title' => 'Custom Styles', // Do not make string translatable, see https://core.trac.wordpress.org/ticket/54518. 'post_type' => $post_type_filter, 'post_name' => sprintf( 'wp-global-styles-%s', urlencode( $stylesheet ) ), 'tax_input' => array( 'wp_theme' => array( $stylesheet ), ), ), true ); if ( ! is_wp_error( $cpt_post_id ) ) { $user_cpt = get_object_vars( get_post( $cpt_post_id ) ); } } return $user_cpt; } /** * Returns the user's origin config. * * @since 5.9.0 * @since 6.6.0 The 'isGlobalStylesUserThemeJSON' flag is left on the user data. * Register the block style variations coming from the user data. * * @return WP_Theme_JSON Entity that holds styles for user data. */ public static function get_user_data() { if ( null !== static::$user && static::has_same_registered_blocks( 'user' ) ) { return static::$user; } $config = array(); $user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme() ); if ( array_key_exists( 'post_content', $user_cpt ) ) { $decoded_data = json_decode( $user_cpt['post_content'], true ); $json_decoding_error = json_last_error(); if ( JSON_ERROR_NONE !== $json_decoding_error ) { wp_trigger_error( __METHOD__, 'Error when decoding a theme.json schema for user data. ' . json_last_error_msg() ); /** * Filters the data provided by the user for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { return $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); return new WP_Theme_JSON( $config, 'custom' ); } } /* * Very important to verify that the flag isGlobalStylesUserThemeJSON is true. * If it's not true then the content was not escaped and is not safe. */ if ( is_array( $decoded_data ) && isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) && $decoded_data['isGlobalStylesUserThemeJSON'] ) { unset( $decoded_data['isGlobalStylesUserThemeJSON'] ); $config = $decoded_data; } } /** This filter is documented in wp-includes/class-wp-theme-json-resolver.php */ $theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$user = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$user = new WP_Theme_JSON( $config, 'custom' ); } return static::$user; } /** * Returns the data merged from multiple origins. * * There are four sources of data (origins) for a site: * * - default => WordPress * - blocks => each one of the blocks provides data for itself * - theme => the active theme * - custom => data provided by the user * * The custom's has higher priority than the theme's, the theme's higher than blocks', * and block's higher than default's. * * Unlike the getters * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_core_data/ get_core_data}, * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_theme_data/ get_theme_data}, * and {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_user_data/ get_user_data}, * this method returns data after it has been merged with the previous origins. * This means that if the same piece of data is declared in different origins * (default, blocks, theme, custom), the last origin overrides the previous. * * For example, if the user has set a background color * for the paragraph block, and the theme has done it as well, * the user preference wins. * * @since 5.8.0 * @since 5.9.0 Added user data, removed the `$settings` parameter, * added the `$origin` parameter. * @since 6.1.0 Added block data and generation of spacingSizes array. * @since 6.2.0 Changed ' $origin' parameter values to 'default', 'blocks', 'theme' or 'custom'. * * @param string $origin Optional. To what level should we merge data: 'default', 'blocks', 'theme' or 'custom'. * 'custom' is used as default value as well as fallback value if the origin is unknown. * @return WP_Theme_JSON */ public static function get_merged_data( $origin = 'custom' ) { if ( is_array( $origin ) ) { _deprecated_argument( __FUNCTION__, '5.9.0' ); } $result = new WP_Theme_JSON(); $result->merge( static::get_core_data() ); if ( 'default' === $origin ) { return $result; } $result->merge( static::get_block_data() ); if ( 'blocks' === $origin ) { return $result; } $result->merge( static::get_theme_data() ); if ( 'theme' === $origin ) { return $result; } $result->merge( static::get_user_data() ); return $result; } /** * Returns the ID of the custom post type * that stores user data. * * @since 5.9.0 * * @return integer|null */ public static function get_user_global_styles_post_id() { if ( null !== static::$user_custom_post_type_id ) { return static::$user_custom_post_type_id; } $user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme(), true ); if ( array_key_exists( 'ID', $user_cpt ) ) { static::$user_custom_post_type_id = $user_cpt['ID']; } return static::$user_custom_post_type_id; } /** * Determines whether the active theme has a theme.json file. * * @since 5.8.0 * @since 5.9.0 Added a check in the parent theme. * @deprecated 6.2.0 Use wp_theme_has_theme_json() instead. * * @return bool */ public static function theme_has_support() { _deprecated_function( __METHOD__, '6.2.0', 'wp_theme_has_theme_json()' ); return wp_theme_has_theme_json(); } /** * Builds the path to the given file and checks that it is readable. * * If it isn't, returns an empty string, otherwise returns the whole file path. * * @since 5.8.0 * @since 5.9.0 Adapted to work with child themes, added the `$template` argument. * * @param string $file_name Name of the file. * @param bool $template Optional. Use template theme directory. Default false. * @return string The whole file path or empty if the file doesn't exist. */ protected static function get_file_path_from_theme( $file_name, $template = false ) { $path = $template ? get_template_directory() : get_stylesheet_directory(); $candidate = $path . '/' . $file_name; return is_readable( $candidate ) ? $candidate : ''; } /** * Cleans the cached data so it can be recalculated. * * @since 5.8.0 * @since 5.9.0 Added the `$user`, `$user_custom_post_type_id`, * and `$i18n_schema` variables to reset. * @since 6.1.0 Added the `$blocks` and `$blocks_cache` variables * to reset. */ public static function clean_cached_data() { static::$core = null; static::$blocks = null; static::$blocks_cache = array( 'core' => array(), 'blocks' => array(), 'theme' => array(), 'user' => array(), ); static::$theme = null; static::$user = null; static::$user_custom_post_type_id = null; static::$i18n_schema = null; } /** * Returns an array of all nested JSON files within a given directory. * * @since 6.2.0 * * @param string $dir The directory to recursively iterate and list files of. * @return array The merged array. */ private static function recursively_iterate_json( $dir ) { $nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ) ); $nested_json_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) ); return $nested_json_files; } /** * Determines if a supplied style variation matches the provided scope. * * For backwards compatibility, if a variation does not define any scope * related property, e.g. `blockTypes`, it is assumed to be a theme style * variation. * * @since 6.6.0 * * @param array $variation Theme.json shaped style variation object. * @param string $scope Scope to check e.g. theme, block etc. * @return boolean */ private static function style_variation_has_scope( $variation, $scope ) { if ( 'block' === $scope ) { return isset( $variation['blockTypes'] ); } if ( 'theme' === $scope ) { return ! isset( $variation['blockTypes'] ); } return false; } /** * Returns the style variations defined by the theme. * * @since 6.0.0 * @since 6.2.0 Returns parent theme variations if theme is a child. * @since 6.6.0 Added configurable scope parameter to allow filtering * theme.json partial files by the scope to which they * can be applied e.g. theme vs block etc. * Added basic caching for read theme.json partial files. * * @param string $scope The scope or type of style variation to retrieve e.g. theme, block etc. * @return array */ public static function get_style_variations( $scope = 'theme' ) { $variation_files = array(); $variations = array(); $base_directory = get_stylesheet_directory() . '/styles'; $template_directory = get_template_directory() . '/styles'; if ( is_dir( $base_directory ) ) { $variation_files = static::recursively_iterate_json( $base_directory ); } if ( is_dir( $template_directory ) && $template_directory !== $base_directory ) { $variation_files_parent = static::recursively_iterate_json( $template_directory ); // If the child and parent variation file basename are the same, only include the child theme's. foreach ( $variation_files_parent as $parent_path => $parent ) { foreach ( $variation_files as $child_path => $child ) { if ( basename( $parent_path ) === basename( $child_path ) ) { unset( $variation_files_parent[ $parent_path ] ); } } } $variation_files = array_merge( $variation_files, $variation_files_parent ); } ksort( $variation_files ); foreach ( $variation_files as $path => $file ) { $decoded_file = self::read_json_file( $path ); if ( is_array( $decoded_file ) && static::style_variation_has_scope( $decoded_file, $scope ) ) { $translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) ); $variation = ( new WP_Theme_JSON( $translated ) )->get_raw_data(); if ( empty( $variation['title'] ) ) { $variation['title'] = basename( $path, '.json' ); } $variations[] = $variation; } } return $variations; } /** * Resolves relative paths in theme.json styles to theme absolute paths * and returns them in an array that can be embedded * as the value of `_link` object in REST API responses. * * @since 6.6.0 * @since 6.7.0 Resolve relative paths in block styles. * * @param WP_Theme_JSON $theme_json A theme json instance. * @return array An array of resolved paths. */ public static function get_resolved_theme_uris( $theme_json ) { $resolved_theme_uris = array(); if ( ! $theme_json instanceof WP_Theme_JSON ) { return $resolved_theme_uris; } $theme_json_data = $theme_json->get_raw_data(); /* * The same file convention when registering web fonts. * See: WP_Font_Face_Resolver::to_theme_file_uri. */ $placeholder = 'file:./'; // Top level styles. $background_image_url = $theme_json_data['styles']['background']['backgroundImage']['url'] ?? null; if ( isset( $background_image_url ) && is_string( $background_image_url ) && // Skip if the src doesn't start with the placeholder, as there's nothing to replace. str_starts_with( $background_image_url, $placeholder ) ) { $file_type = wp_check_filetype( $background_image_url ); $src_url = str_replace( $placeholder, '', $background_image_url ); $resolved_theme_uri = array( 'name' => $background_image_url, 'href' => sanitize_url( get_theme_file_uri( $src_url ) ), 'target' => 'styles.background.backgroundImage.url', ); if ( isset( $file_type['type'] ) ) { $resolved_theme_uri['type'] = $file_type['type']; } $resolved_theme_uris[] = $resolved_theme_uri; } // Block styles. if ( ! empty( $theme_json_data['styles']['blocks'] ) ) { foreach ( $theme_json_data['styles']['blocks'] as $block_name => $block_styles ) { if ( ! isset( $block_styles['background']['backgroundImage']['url'] ) ) { continue; } $background_image_url = $block_styles['background']['backgroundImage']['url']; if ( is_string( $background_image_url ) && // Skip if the src doesn't start with the placeholder, as there's nothing to replace. str_starts_with( $background_image_url, $placeholder ) ) { $file_type = wp_check_filetype( $background_image_url ); $src_url = str_replace( $placeholder, '', $background_image_url ); $resolved_theme_uri = array( 'name' => $background_image_url, 'href' => sanitize_url( get_theme_file_uri( $src_url ) ), 'target' => "styles.blocks.{$block_name}.background.backgroundImage.url", ); if ( isset( $file_type['type'] ) ) { $resolved_theme_uri['type'] = $file_type['type']; } $resolved_theme_uris[] = $resolved_theme_uri; } } } return $resolved_theme_uris; } /** * Resolves relative paths in theme.json styles to theme absolute paths * and merges them with incoming theme JSON. * * @since 6.6.0 * * @param WP_Theme_JSON $theme_json A theme json instance. * @return WP_Theme_JSON Theme merged with resolved paths, if any found. */ public static function resolve_theme_file_uris( $theme_json ) { $resolved_urls = static::get_resolved_theme_uris( $theme_json ); if ( empty( $resolved_urls ) ) { return $theme_json; } $resolved_theme_json_data = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA, ); foreach ( $resolved_urls as $resolved_url ) { $path = explode( '.', $resolved_url['target'] ); _wp_array_set( $resolved_theme_json_data, $path, $resolved_url['href'] ); } $theme_json->merge( new WP_Theme_JSON( $resolved_theme_json_data ) ); return $theme_json; } /** * Adds variations sourced from block style variations files to the supplied theme.json data. * * @since 6.6.0 * * @param array $data Array following the theme.json specification. * @param array $variations Shared block style variations. * @return array Theme json data including shared block style variation definitions. */ private static function inject_variations_from_block_style_variation_files( $data, $variations ) { if ( empty( $variations ) ) { return $data; } foreach ( $variations as $variation ) { if ( empty( $variation['styles'] ) || empty( $variation['blockTypes'] ) ) { continue; } $variation_name = $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ); foreach ( $variation['blockTypes'] as $block_type ) { // First, override partial styles with any top-level styles. $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); if ( ! empty( $top_level_data ) ) { $variation['styles'] = array_replace_recursive( $variation['styles'], $top_level_data ); } // Then, override styles so far with any block-level styles. $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); if ( ! empty( $block_level_data ) ) { $variation['styles'] = array_replace_recursive( $variation['styles'], $block_level_data ); } $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); _wp_array_set( $data, $path, $variation['styles'] ); } } return $data; } /** * Adds variations sourced from the block styles registry to the supplied theme.json data. * * @since 6.6.0 * * @param array $data Array following the theme.json specification. * @return array Theme json data including shared block style variation definitions. */ private static function inject_variations_from_block_styles_registry( $data ) { $registry = WP_Block_Styles_Registry::get_instance(); $styles = $registry->get_all_registered(); foreach ( $styles as $block_type => $variations ) { foreach ( $variations as $variation_name => $variation ) { if ( empty( $variation['style_data'] ) ) { continue; } // First, override registry styles with any top-level styles. $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); if ( ! empty( $top_level_data ) ) { $variation['style_data'] = array_replace_recursive( $variation['style_data'], $top_level_data ); } // Then, override styles so far with any block-level styles. $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); if ( ! empty( $block_level_data ) ) { $variation['style_data'] = array_replace_recursive( $variation['style_data'], $block_level_data ); } $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); _wp_array_set( $data, $path, $variation['style_data'] ); } } return $data; } } Voer een e-mailadres in.','This field has a too large number.'=>'Dit veld heeft een te groot nummer.','This field has a too small number.'=>'Dit veld heeft een te klein nummer.','Please enter a number.'=>'Voer alstublieft een nummer in.','This field has a too late date.'=>'Dit veld heeft een te late datum.','This field has a too early date.'=>'Dit veld heeft een te vroege datum.','Please enter a date in YYYY-MM-DD format.'=>'Voer een datum in de JJJJ-MM-DD format in.','The request payload format is not supported.'=>'Het format van de request payload wordt niet ondersteund.','Hook %1$s is deprecated since Contact Form 7 version %2$s with no alternative available.'=>'Hook %1$s is vanaf Contact Form 7 versie %2$s verouderd met geen alternatief beschikbaar.','The uploaded file is too large.'=>'Het geüploade bestand is te groot.','This field has a too short input.'=>'Dit veld heeft een te korte invoer.','This field has a too long input.'=>'Dit veld heeft een te grote invoer.','Please fill out this field.'=>'Vul dit veld in.','Function %1$s is deprecated since Contact Form 7 version %2$s! Use %3$s instead.'=>'Functie %1$s is verouderd sinds Contact Form 7 versie %2$s! Gebruik in plaats daarvan %3$s.','Spam protection'=>'Spam bescherming','Function %1$s was called incorrectly. %2$s %3$s'=>'Functie %1$s is onjuist aangeroepen. %2$s %3$s','Hello, This is a confirmation email sent from %1$s. We have received your submission to our web form, according to which you have allowed us to add you to our contact list. But, the process has not yet been completed. To complete it, please click the following link. %2$s If it was not your intention, or if you have no idea why you received this message, please do not click on the link, and ignore this message. We will never collect or use your personal data without your clear consent. Sincerely, %1$s'=>'Hallo Dit is een bevestiging e-mail verzonden vanaf %1$s. We hebben je inzending ontvangen op ons webformulier, volgens welke je ons hebt toegestaan om je toe te voegen aan onze contactenlijst. Maar het proces is nog niet afgerond. Om het te voltooien, klik je op de volgende link. %2$s Als het niet je bedoeling was, of als je geen idee hebt waarom je dit bericht hebt ontvangen, klik dan niet op de link en negeer dit bericht. We zullen nooit je persoonsgegevens verzamelen of gebruiken zonder je duidelijke toestemming. Oprecht %1$s','Opt-in confirmation from %s'=>'Opt-in bevestiging van %s','You can set up the Constant Contact integration here. For details, see %s.'=>'Je kunt de Constant Contact integratie hier instellen. Voor details, zie %s.','Complete payment'=>'Betaling voltooien','Proceed to checkout'=>'Ga verder met afrekenen','Payment is required. Please pay by credit card.'=>'Betaling is vereist. Betaal met een creditcard.','Payments'=>'Betalingen','Publishable Key'=>'Publiceerbare sleutel','Stripe is not available on this site. It requires an HTTPS-enabled site.'=>'Stripe is niet beschikbaar op deze site. Hiervoor is een https site vereist.','Stripe is active on this site.'=>'Stripe is actief op deze site.','Stripe integration'=>'Stripe integratie','Stripe is a simple and powerful way to accept payments online. Stripe has no setup fees, no monthly fees, and no hidden costs. Millions of businesses rely on Stripe’s software tools to accept payments securely and expand globally.'=>'Stripe is een eenvoudige en krachtige manier om online betalingen te accepteren. Stripe heeft geen opstartkosten, geen maandelijkse kosten en geen verborgen kosten. Miljoenen bedrijven vertrouwen op de softwaregereedschappen van Stripe om betalingen veilig te accepteren en wereldwijd uit te breiden.','personal name%1$s %2$s'=>'%1$s %2$s','Unique identifier for the contact form.'=>'Unieke identificatiecode voor het contactformulier.','Dots are used in form-tag names.'=>'Punten worden gebruikt in formulier tag namen.','Show welcome panel'=>'Welkomstpaneel weergeven','Welcome panel'=>'Welkomstpaneel','Stripe'=>'Stripe','https://contactform7.com/stripe-integration/'=>'https://contactform7.com/stripe-integration/','With help from cloud-based machine learning, anti-spam services will protect your forms (%1$s). Even payment services are natively supported (%2$s).'=>'Met behulp van cloudgebaseerde machine learning beschermen antispam diensten je formulieren (%1$s). Zelfs betalingsdiensten worden standaard ondersteund (%2$s).','Your contact forms will become more powerful and versatile by integrating them with external APIs. With CRM and email marketing services, you can build your own contact lists (%1$s).'=>'Je contactformulieren worden krachtiger en veelzijdiger door ze te integreren met externe API\'s. Met CRM en e-mail marketing diensten kun je je eigen contact lijsten bouwen (%1$s).','You have strong allies to back you up.'=>'Je hebt sterke bondgenoten om je te steunen.','Integration with external APIs'=>'Integratie met externe API\'s','https://contactform7.com/integration-with-external-apis/'=>'https://contactform7.com/integration-with-external-apis/','You can expand the possibilities of your contact forms by integrating them with external services. For details, see %s.'=>'Je kunt de mogelijkheden van je contactformulieren uitbreiden door ze te integreren met externe diensten. Zie %s voor meer informatie.','Integration with External API'=>'Integratie met externe API','Manage your email templates'=>'Beheer je e-mailtemplates','You have no active email template yet.'=>'Je hebt nog geen actief e-mailtemplate.','— Select —'=>'— Selecteer —','Select an email template:'=>'Selecteer een e-mailtemplate:','Send a welcome email to new contacts'=>'Stuur een welkomst e-mail naar nieuwe contacten','Welcome email'=>'Welkomst e-mail','(opens in a new tab)'=>'(opent in een nieuwe tab)','Manage your contact lists'=>'Beheer je contactlijsten','You have no contact list yet.'=>'Je hebt nog geen contactlijst.','Select lists to which contacts are added:'=>'Selecteer lijsten waaraan contacten worden toegevoegd:','Add form submitters to your contact lists'=>'Voeg indieners van formulieren toe aan je contactlijsten','Contact lists'=>'Contactlijsten','You can set up the Brevo integration here. For details, see %s.'=>'Je kunt hier de Brevo integratie opzetten. Zie %s voor details.','Save changes'=>'Wijzigingen opslaan','API keysRemove key'=>'Sleutel verwijderen','API key'=>'API-sleutel','Setup integration'=>'Installatie integratie','https://contactform7.com/sendinblue-integration/'=>'https://contactform7.com/sendinblue-integration/','Store and organize your contacts while protecting user privacy on Brevo, the leading CRM & email marketing platform in Europe. Brevo offers unlimited contacts and advanced marketing features.'=>'Opslaan en organiseren van je contacten terwijl je de privacy van gebruikers beschermt op Brevo, het toonaangevende CRM & e-mailmarketing platform in Europa. Brevo biedt onbeperkte contacten en geavanceerde marketing functies.','You have not been authenticated. Make sure the provided API key is correct.'=>'Je bent niet geauthenticeerd. Zorg ervoor dat de verstrekte API-sleutel correct is.','Failed to attach a file. The total file size exceeds the limit of 25 megabytes.'=>'Het bijvoegen van een bestand is mislukt. De totale bestandsgrootte is groter dan de limiet van 25 megabytes.','Failed to attach a file. %s is not a readable file.'=>'Het bijvoegen van een bestand is mislukt. %s is geen leesbaar bestand.','Failed to attach a file. %s is not in the allowed directory.'=>'Het bijvoegen van een bestand is mislukt. %s staat niet in de toegestane folder.','Submit'=>'Verzenden','(optional)'=>'(optioneel)','disallowed list'=>'lijst niet toegestaan','Disallowed words (%s) are used.'=>'Niet toegestane woorden (%s) zijn gebruikt.','Disallowed words are used.'=>'Niet toegestane woorden zijn gebruikt.','(This message was added in Contact Form 7 version %s.)'=>'(Dit bericht is toegevoegd in Contact Form 7 versie %s.)','The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.'=>'De vierde parameter ($mail_tag) moet een instantie zijn van de klasse WPCF7_MailTag.','g:i a'=>'H:i','%1$s at %2$s'=>'%1$s om %2$s','docs'=>'documenten','%1$s and %2$s'=>'%1$s en %2$s','Additional settings'=>'Extra instellingen','Error'=>'Fout','The total size of attachment files is too large.'=>'De totale omvang van de bijlagen is te groot.','Unavailable HTML elements are used in the form template.'=>'Er zijn niet beschikbare HTML elementen gebruikt in de formulier template.','reCAPTCHA is active on this site.'=>'reCAPTCHA is actief op deze site.','reCAPTCHA response token is empty.'=>'reCAPTHA reactie token is leeg.','Submitted nonce is invalid.'=>'Ingezonden nonce is ongeldig.','User-Agent string is unnaturally short.'=>'User-Agent string is te kort.','reCAPTCHA score (%1$.2f) is lower than the threshold (%2$.2f).'=>'reCAPTCHA score (%1$.2f) is lager dan de drempelwaarde (%2$.2f).','Akismet returns a spam response.'=>'Askimet stuurt een spam reactie terug.','API keysReset Keys'=>'Reset sleutels','This site is connected to the Constant Contact API.'=>'Deze site is verbonden met de Constant Contact API.','Configuration updated.'=>'Configuratie geüpdatet.','Failed to establish connection. Please double-check your configuration.'=>'Kan geen verbinding tot stand brengen. Controleer je configuratie opnieuw.','Connection established.'=>'Verbinding tot stand gebracht.','HTTP Response: %1$s %2$s %3$s from %4$s'=>'HTTP reactie: %1$s %2$s %3$s van %4$s','Save Changes'=>'Veranderingen opslaan','reCAPTCHA protects you against spam and other types of automated abuse. With Contact Form 7’s reCAPTCHA integration module, you can block abusive form submissions by spam bots.'=>'reCAPTCHA beschermt je tegen spam en andere types geautomatiseerd misbruik. Met de Contact Form 7 reCAPTCHA integratiemodule kun je het misbruik van formulier invullen door spamrobots blokkeren.','reCAPTCHA (v3)'=>'reCAPTCHA (v3)','API keys for reCAPTCHA v3 are different from those for v2; keys for v2 do not work with the v3 API. You need to register your sites again to get new keys for v3. For details, see %s.'=>'API-sleutels voor reCAPTCHA v3 zijn afwijkend dan de API-sleutels voor v2; sleutels voor v2 werken niet met die van v3 API. Je moet je site(s) opnieuw registreren om nieuwe API-sleutels te verkrijgen voor v3. Voor details, see %s.','Connect to the Constant Contact API'=>'Verbindt met de Constant Contact API','API keysRemove Keys'=>'Verwijder sleutels','Set this URL as the redirect URI.'=>'Stel deze URL in als de URL voor omleiden.','Redirect URI'=>'Omleiding URI','App Secret'=>'App geheim','API Key'=>'API-sleutel','Setup Integration'=>'Integratie instellen','Constant Contact integration'=>'Constant contact integratie','https://contactform7.com/constant-contact-integration/'=>'https://contactform7.com/constant-contact-integration/','The Constant Contact integration module allows you to send contact data collected through your contact forms to the Constant Contact API. You can create reliable email subscription services in a few easy steps.'=>'De Constant Contact integratie module maakt het mogelijk om contact gegevens die verzameld is via je contact formulieren te sturen naar de Constant Contact API. Je kan veilige e-mail inschrijving diensten aanmaken in enkele eenvoudige stappen.','Constant Contact'=>'Constant kontakt','Email marketing'=>'E-mail marketing','It is not allowed to use files outside the wp-content directory.'=>'Het is niet toegestaan bestanden buiten de wp-content folder te gebruiken.','Make this checkbox optional'=>'Maak dit selectievakje optioneel','Professional services'=>'Professionele diensten','https://contactform7.com/custom-development/'=>'https://contactform7.com/custom-development/','Support forums'=>'Ondersteuning forums','https://wordpress.org/support/plugin/contact-form-7/'=>'https://nl.wordpress.org/support/plugin/contact-form-7/','Here are some available options to help solve your problems.'=>'Hier is een aantal beschikbare opties die helpen om je problemen te helpen oplossen.','Do you need help?'=>'Heb je hulp nodig?','Condition'=>'Voorwaarde','mail output for acceptance checkboxes%1$s: %2$s'=>'%1$s: %2$s','Not consented'=>'Niet ingestemd','Consented'=>'Ingestemd','Sending mail has been aborted.'=>'Het verzenden van e-mail is afgebroken.','You can edit messages used in various situations here. For details, see %s.'=>'Je kan berichten die in verschillende situaties worden gebruikt hier bewerken; voor details, zie %s.','Editing messages'=>'Berichten bewerken','https://contactform7.com/editing-messages/'=>'https://contactform7.com/editing-messages/','You can edit the mail template here. For details, see %s.'=>'Je kan hier het e-mail template bewerken; voor details, zie %s.','You can edit the form template here. For details, see %s.'=>'Je kan hier het formulier template bewerken; voor details, zie %s.','Editing form template'=>'Formulier template bewerken','https://contactform7.com/editing-form-template/'=>'https://contactform7.com/editing-form-template/','(left and right arrow)'=>'(pijltje links en rechts)','%1$s %2$s keys switch panels'=>'%1$s %2$s toetsen wisselen panelen','(configuration error)'=>'(configuratiefout)','How to resolve?'=>'Hoe op te lossen?','Your donation will help encourage and support the plugin’s continued development and better user support.'=>'Je donatie helpt met het aanmoedigen en ondersteunen van de voortdurende ontwikkeling en betere gebruikersondersteuning van de plugin.','making a donation'=>'een donatie doen','If you enjoy using Contact Form 7 and find it useful, please consider %s.'=>'Als het gebruik van Contact Form 7 je bevalt en je vindt het handig, overweeg dan een %s.','It is hard to continue development and support for this plugin without contributions from users like you.'=>'Het is moeilijk de ontwikkeling en ondersteuning van deze plugin voort te zetten zonder bijdrages van gebruikers als jij.','This contact form is available only for logged in users.'=>'Dit contactformulier is alleen beschikbaar voor ingelogde gebruikers.','Deprecated settings are used.'=>'Er worden verouderde instellingen gebruikt.','To use CAPTCHA, you need %s plugin installed.'=>'Om CAPTCHA te kunnen gebruiken moet je plugin %s installeren.','There was an error deleting the contact form.'=>'Er is een fout opgetreden bij het verwijderen van het contactformulier.','You are not allowed to access the requested contact form.'=>'Je hebt geen toestemming om het opgevraagde contactformulier te bewerken.','The requested contact form was not found.'=>'Het opgevraagde contactformulier is niet gevonden.','You are not allowed to create a contact form.'=>'Je hebt geen toestemming om een contactformulier te creëren.','Cannot create existing contact form.'=>'Bestaand contactformulier kan niet aangemaakt worden.','You are not allowed to access contact forms.'=>'Je hebt geen toestemming om de contactformulieren te openen.','Attachment file does not exist at %path%.'=>'Het bijlagebestand is niet aanwezig in %path%.','Invalid mailbox syntax is used in the %name% field.'=>'Er wordt een ongeldige mailbox syntax gebruikt in het veld %name%.','Unavailable names (%names%) are used for form controls.'=>'Er worden niet-beschikbare namen (%names%) gebruikt voor de formulierbesturing.','There are invalid mail header fields.'=>'Er zijn ongeldige mail header velden.','HTML tags are used in a message.'=>'Er worden HTML tags in een bericht gebruikt.','Sender email address does not belong to the site domain.'=>'Het e-mailadres van de afzender behoort niet tot het domeinnaam van de site.','Invalid mailbox syntax is used.'=>'Er wordt een ongeldige mailbox syntax gebruikt.','There is a possible empty field.'=>'Er is mogelijk een leeg veld.','%s configuration error detected'=>'%s configuratiefout gevonden' . "\0" . '%s configuratiefouten gevonden','There was an error saving the contact form.'=>'Er deed zich een fout voor bij het opslaan van het formulier.','%d configuration errors detected in this tab panel'=>'%d fouten in de configuratie die in dit tab paneel ontdekt werden','1 configuration error detected in this tab panel'=>'1 configuratie fout op dit tab paneel gevonden','%d configuration errors detected'=>'%d configuratiefouten gevonden','1 configuration error detected'=>'1 configuratie fout gedetecteerd','Hook %1$s is deprecated since Contact Form 7 version %2$s! Use %3$s instead.'=>'Hook %1$s is verouderd sinds Contact Form 7 versie %2$s! Gebruik in plaats daarvan %3$s.','Flamingo'=>'Flamingo','Install a message storage plugin before this happens to you. %s saves all messages through contact forms into the database. Flamingo is a free WordPress plugin created by the same author as Contact Form 7.'=>'Installeer een berichtopslag plugin om te voorkomen dat dit gebeurt; %s slaat alle berichten van contactformulieren op in de database. Flamingo is een gratis WordPress plugin, gemaakt door dezelfde auteur als Contact Form 7.','Contact Form 7 does not store submitted messages anywhere. Therefore, you may lose important messages forever if your mail server has issues or you make a mistake in mail configuration.'=>'Contact Form 7 slaat verzonden berichten nergens op. Let dus op; Daarom kun je belangrijke berichten voor altijd kwijtraken, als de mailserver niet werkt of als er fouten gemaakt worden in de e-mail configuratie.','Before you cry over spilt mail…'=>'Voordat je gaat verdrietig wordt over verloren gegane e-mail…','https://contactform7.com/comment-blacklist/'=>'http://contactform7.com/comment-blacklist/','Contact Form 7 supports spam-filtering with %1$s. Intelligent %2$s blocks annoying spambots. Plus, using %3$s, you can block messages containing specified keywords or those sent from specified IP addresses.'=>'Contact Form 7 ondersteunt spamfilters met %1$s. Intelligent %2$s blokkeren van irritante spambots. Plus, door %3$s te gebruiken kun je berichten blokkeren die bepaalde keywords bevatten of die verzonden zijn vanaf bepaalde IP-adressen.','Spammers target everything; your contact forms are not an exception. Before you get spammed, protect your contact forms with the powerful anti-spam features Contact Form 7 provides.'=>'Spammers nemen alles op de korrel; je contactgegevens vormen hierop geen uitzondering. Bescherm je contactformulieren met de krachtige anti-spam opties die Contact Form 7 biedt, voordat je gespamd wordt.','Getting spammed? You have protection.'=>'Word je gespamd? Dan wordt je beschermd.','Multiple form controls are in a single label element.'=>'Er zitten meerdere formulierbesturingsopties in een enkel labelelement.','FAQ about Configuration Validator'=>'FAQ over de Configuratie validator','https://contactform7.com/configuration-validator-faq/'=>'https://contactform7.com/configuration-validator-faq/','The answer to the quiz is incorrect.'=>'Het antwoord op de quiz is incorrect.','There was an error uploading the file.'=>'Er is een fout opgetreden bij het uploaden van het bestand.','You are not allowed to upload files of this type.'=>'Je hebt geen toestemming om bestanden van dit type te uploaden.','There was an unknown error uploading the file.'=>'Er is een onbekende fout opgetreden bij het uploaden van het bestand.','You must accept the terms and conditions before sending your message.'=>'Je moet de voorwaarden accepteren voordat je het bericht kunt verzenden.','One or more fields have an error. Please check and try again.'=>'Een of meer velden bevatten een fout; graag controleren en opnieuw proberen.','There was an error trying to send your message. Please try again later.'=>'Er is een fout opgetreden bij het versturen van het bericht; probeer het later nog eens.','Thank you for your message. It has been sent.'=>'Bedankt voor je bericht. Het is verzonden.','mail subject%1$s "%2$s"'=>'%1$s "%2$s"','Misconfiguration leads to mail delivery failure or other troubles. Validate your contact forms now.'=>'Foutieve configuratie zorgt ervoor dat e-mailberichten niet worden afgeleverd of dat er andere fouten optreden. Controleer je contactformulieren nu.','Validate Contact Form 7 Configuration'=>'Controleer de configuratie van Contact Form 7','https://contactform7.com/configuration-errors/'=>'https://contactform7.com/configuration-errors/','Configuration validation completed. No invalid contact form was found.'=>'Configuratiecontrole afgerond; er is geen ongeldig contactformulier gevonden.','Configuration validation completed. %s invalid contact form was found.'=>'Configuratiecontrole afgerond. %s ongeldig contactformulier is gevonden.' . "\0" . 'Configuratiecontrole afgerond. %s ongeldige contactformulieren zijn gevonden.','Validate Configuration'=>'Configuratie controleren','Validate %s contact form now'=>'%s contactformulier nu controleren' . "\0" . '%s contactformulieren nu controleren','You are not allowed to validate configuration.'=>'Je hebt geen toestemming om de configuratie te controleren.','https://contactform7.com/recaptcha/'=>'https://contactform7.com/recaptcha/','Secret Key'=>'Geheime sleutel','Site Key'=>'Site sleutel','Settings saved.'=>'Instellingen opgeslagen.','Invalid key values.'=>'Ongeldige sleutelwaarden.','reCAPTCHA'=>'reCAPTCHA','CAPTCHA (Really Simple CAPTCHA)'=>'CAPTCHA (Really Simple CAPTCHA)','https://ideasilo.wordpress.com/'=>'https://ideasilo.wordpress.com/','Takayuki Miyoshi'=>'Takayuki Miyoshi','Just another contact form plugin. Simple but flexible.'=>'Gewoon een ander contactformulier plugin. Eenvoudig maar flexibel.','https://contactform7.com/'=>'https://contactform7.com/','Contact form %d'=>'Contactformulier %d','Generate a form-tag for a multi-line text input field. For more details, see %s.'=>'Een formulier tag generen voor een tekst invoerveld van meerdere regels; voor meer informatie, zie %s.','text area'=>'tekstgebied','This field requires author\'s URL'=>'Dit veld vereist de site URL van de auteur','This field requires author\'s email address'=>'Dit veld vereist het e-mailadres van de auteur','This field requires author\'s name'=>'Dit veld vereist de naam van de auteur','Akismet'=>'Akismet','Text fields'=>'Tekst velden','https://contactform7.com/text-fields/'=>'https://contactform7.com/text-fields/','Generate a form-tag for a single-line telephone number input field. For more details, see %s.'=>'Een formulier tag generen voor een eenregelig telefoonnummer invoerveld; voor meer informatie, zie %s.','Generate a form-tag for a single-line URL input field. For more details, see %s.'=>'Een formulier tag genereren voor een eenregelig URL invoerveld; voor meer informatie, zie %s.','Generate a form-tag for a single-line email address input field. For more details, see %s.'=>'Een formulier tag genereren voor een eenregelig e-mailadres invoerveld; voor meer informatie, zie %s.','Generate a form-tag for a single-line plain text input field. For more details, see %s.'=>'Een formulier tag genereren voor een eenregelig tekst invoerveld; voor meer informatie, zie %s.','tel'=>'tel','URL'=>'URL','email'=>'e-mail','text'=>'tekst','Telephone number that the sender entered is invalid'=>'Het telefoonnummer dat de gebruiker heeft ingevoerd, is ongeldig','URL that the sender entered is invalid'=>'De URL die de gebruiker heeft ingevoerd, is ongeldig','Email address that the sender entered is invalid'=>'Het e-mailadres dat de gebruiker heeft ingevoerd, is ongeldig','Label'=>'Label','Submit button'=>'Verzend knop','https://contactform7.com/submit-button/'=>'https://contactform7.com/submit-button/','Generate a form-tag for a submit button. For more details, see %s.'=>'Een formulier tag genereren voor de verzenden knop; voor meer informatie, zie %s.','submit'=>'verzenden','Insert a blank item as the first option'=>'Voer een leeg item in als eerste optie','Allow multiple selections'=>'Meerdere selecties toestaan','Generate a form-tag for a drop-down menu. For more details, see %s.'=>'Een formulier tag genereren voor een dropdown menu; voor meer informatie, zie %s.','drop-down menu'=>'dropdown-menu','One pipe-separated question-answer pair (e.g. The capital of Brazil?|Rio) per line.'=>'Per regel één door een pipe gescheiden vraag-antwoordpaar (bijv. De hoofdstad van Brazilië?|Rio).','Questions and answers'=>'Vragen en antwoorden','Quiz'=>'Quiz','https://contactform7.com/quiz/'=>'https://contactform7.com/quiz/','Generate a form-tag for a question-answer pair. For more details, see %s.'=>'Een formulier tag generen voor een vraag antwoordpaar; voor meer informatie, zie %s.','quiz'=>'quiz','Sender does not enter the correct answer to the quiz'=>'De verzender heeft niet het juiste antwoord op de quizvraag ingevuld','Slider'=>'Slider','Spinbox'=>'Getalveld (spinbox)','Number fields'=>'Numerieke velden','https://contactform7.com/number-fields/'=>'https://contactform7.com/number-fields/','Generate a form-tag for a field for numeric value input. For more details, see %s.'=>'Genereer een formulier tag voor een invoerveld met numerieke waarde; voor meer informatie, zie %s.','number'=>'getal','Number is larger than maximum limit'=>'Getal is groter dan de maximumwaarde','Number is smaller than minimum limit'=>'Getal is kleiner dan de minimumwaarde','Number format that the sender entered is invalid'=>'Getal format dat de verzender heeft ingevoerd is ongeldig','This contact form has file uploading fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.'=>'Dit contactformulier bevat bestand upload velden, maar de tijdelijke map voor de bestanden (%s) bestaat niet of is niet schrijfbaar. Je kunt die map aanmaken of de rechten van de map handmatig wijzigen.','To attach the file uploaded through this field to mail, you need to insert the corresponding mail-tag (%s) into the File Attachments field on the Mail tab.'=>'Om het geüploade bestand d.m.v. dit veld toe te voegen aan een e-mail moet de corresponderende mail tag (%s) ingevoegd worden in het bestand bijlageveld op de mail tab.','Acceptable file types'=>'Toegestane bestandstypes','File size limit (bytes)'=>'Beperking bestandsgrootte (bytes)','File uploading and attachment'=>'Bestand uploaden en bijlage','https://contactform7.com/file-uploading-and-attachment/'=>'https://contactform7.com/file-uploading-and-attachment/','Generate a form-tag for a file uploading field. For more details, see %s.'=>'Een formulier tag generen voor een bestand upload veld; voor meer informatie, zie %s.','file'=>'bestand','Uploading a file fails for PHP error'=>'Het uploaden van een bestand is mislukt door een PHP fout','Uploaded file is too large'=>'Het te uploaden bestand is te groot','Uploaded file is not allowed for file type'=>'Geüpload bestand is niet toegestaan voor bestandstype','Uploading a file fails for any reason'=>'Bestand uploaden is mislukt om onbekende redenen','Max'=>'Max','Min'=>'Min','Range'=>'Bereik','Use this text as the placeholder of the field'=>'Gebruik deze tekst als plaatshouder van het veld','Default value'=>'Standaardwaarde','Date field'=>'Datum veld','https://contactform7.com/date-field/'=>'https://contactform7.com/date-field/','Generate a form-tag for a date input field. For more details, see %s.'=>'Genereer een formulier tag voor een datum invoerveld. Voor meer informatie, zie %s.','date'=>'datum','Date is later than maximum limit'=>'Datum ligt na de laatst toegestane datum','Date is earlier than minimum limit'=>'Datum ligt vóór de vroegst toegestane datum','Date format that the sender entered is invalid'=>'De datumnotatie van de verzender is ongeldig','To use the value input through this field in a mail field, you need to insert the corresponding mail-tag (%s) into the field on the Mail tab.'=>'Om de ingevoerde waarde van dit veld te kunnen gebruiken in een e-mail veld, moet je de corresponderende e-mail tag (%s) in het veld op de e-mail tab invoeren.','Make checkboxes exclusive'=>'Maak selectievakjes exclusief','Wrap each item with label element'=>'Omsluit elk item met een labelelement','Put a label first, a checkbox last'=>'Plaats eerst een label, een selectie vakje als laatste','One option per line.'=>'Één optie per regel.','Required field'=>'Verplicht veld','Field type'=>'Veldtype','Checkboxes, radio buttons and menus'=>'Selectievakjes, keuzerondjes en menu\'s','https://contactform7.com/checkboxes-radio-buttons-and-menus/'=>'https://contactform7.com/checkboxes-radio-buttons-and-menus/','Generate a form-tag for a group of radio buttons. For more details, see %s.'=>'Een formulier tag genereren voor een groep keuzerondjes; voor meer informatie, zie %s.','Generate a form-tag for a group of checkboxes. For more details, see %s.'=>'Een formulier tag genereren voor een groep selectievakjes; voor meer informatie, zie %s.','radio buttons'=>'keuzerondjes','checkboxes'=>'Selectievakjes','This contact form contains CAPTCHA fields, but the necessary libraries (GD and FreeType) are not available on your server.'=>'Dit contact formulier bevat CAPTCHA velden, maar de benodigde bibliotheken (GD en FreeType) zijn niet beschikbaar op je server.','This contact form contains CAPTCHA fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.'=>'Dit contactformulier bevat CAPTCHA velden, maar de tijdelijke map voor de bestanden (%s) bestaat niet of heeft geen schrijfrechten. Je kunt de map aanmaken of de rechten handmatig wijzigen.','Input field settings'=>'Invoerveldinstellingen','Image settings'=>'Afbeeldingsinstellingen','https://contactform7.com/captcha/'=>'https://contactform7.com/captcha/','Generate form-tags for a CAPTCHA image and corresponding response input field. For more details, see %s.'=>'Formulier tags genereren voor een CAPTCHA afbeelding en het bijbehorende reactie invoerveld; voor meer informatie, zie %s.','To use CAPTCHA, you first need to install and activate %s plugin.'=>'Om CAPTCHA te kunnen gebruiken, moet eerst plugin %s geïnstalleerd en geactiveerd worden.','CAPTCHA'=>'CAPTCHA','Your entered code is incorrect.'=>'Je ingevoerde code is onjuist.','The code that sender entered does not match the CAPTCHA'=>'De ingevulde verificatiecode komt niet overeen met de CAPTCHA','Insert Tag'=>'Tag invoeren','Class attribute'=>'Class-attribuut','Id attribute'=>'ID attribuut','Options'=>'Opties','Name'=>'Naam','Acceptance checkbox'=>'Acceptatie selectievakje','https://contactform7.com/acceptance-checkbox/'=>'https://contactform7.com/acceptance-checkbox/','Generate a form-tag for an acceptance checkbox. For more details, see %s.'=>'Een formulier tag genereren voor het acceptatie selectievakje; voor meer informatie, zie %s.','acceptance'=>'acceptatie','%1$s property of a WPCF7_ContactForm object is no longer accessible. Use %2$s method instead.'=>'%1$s eigenschap van een WPCF7_ContactForm object is niet langer beschikbaar. Gebruik in plaats daarvan de methode %2$s.','Untitled'=>'Zonder titel','Contact Form'=>'Contactformulier','There is a field with input that is shorter than the minimum allowed length'=>'Er is een veld waarbij de invoer korter is dan de minimaal toegestane lengte','There is a field with input that is longer than the maximum allowed length'=>'Er is een veld met invoer die de maximaal toegestane lengte overschrijdt','There is a field that the sender must fill in'=>'Er is een veld dat door de verzender nog ingevuld moet worden','There are terms that the sender must accept'=>'Er zijn voorwaarden die door de verzender moeten worden geaccepteerd','Submission was referred to as spam'=>'Het bericht is aangemerkt als spam','Validation errors occurred'=>'Er zijn validatiefouten opgetreden','Sender\'s message failed to send'=>'Bericht kon niet worden verzonden','Sender\'s message was sent successfully'=>'Bericht van de verzender is met succes verstuurd','Message Body:'=>'Berichtinhoud:','Subject: %s'=>'Onderwerp: %s','From: %s'=>'Van: %s','Send'=>'Verzenden','Your message'=>'Je bericht','Your email'=>'Je e-mailadres','Your name'=>'Je naam','Form-tag Generator: %s'=>'Formulier tag generator: %s','For more information:'=>'Voor meer informatie:','Any information you provide will not be shared with service providers without your authorization.'=>'Alle informatie die je verstrekt zal niet zonder je toestemming met de dienst provider worden gedeeld.','You may need to first sign up for an account with the service that you plan to use. When you do so, you would need to authorize Contact Form 7 to access the service with your account.'=>'Mogelijk moet je jezelf aanmelden voor een account van de dienst die je wil gaan gebruiken. Als je dat doet, moet je Contact Formulier 7 toegang verlenen tot de dienst met je account.','On this screen, you can manage services that are available through Contact Form 7. Using API will allow you to collaborate with any services that are available.'=>'In dit scherm kan je de diensten beheren die beschikbaar zijn d.m.v. Contact Form 7. Het gebruik van de API maakt samenwerking met alle beschikbare diensten mogelijk.','There are also special mail-tags that have specific names, but do not have corresponding form-tags. They are used to represent meta information of form submissions like the submitter’s IP address or the URL of the page.'=>'Er zijn ook speciale mail tags met specifieke namen, maar zonder overeenkomstige formulier tags. Deze worden gebruikt om meta-informatie van de verstuurde formulieren weer te geven, zoals het IP-adres van de gebruiker of de URL van de pagina.','A mail-tag is also a short code enclosed in square brackets that you can use in every Mail and Mail (2) field. A mail-tag represents a user input value through an input field of a corresponding form-tag.'=>'Een e-mail tag is ook een shortcode, omsloten door rechte haakjes, die je kunt gebruiken in ieder e-mail en e-mail(2) veld. Een e-mail tag stelt een door de gebruiker in een invoerveld ingevulde waarde voor van een bijbehorende formulier tag.','While form-tags have a comparatively complex syntax, you do not need to know the syntax to add form-tags because you can use the straightforward tag generator (Generate Tag button on this screen).'=>'Hoewel formulier tags een relatief complexe syntax hebben hoef je deze syntax niet te kennen om formulier tags toe te voegen, omdat je de recht-toe-recht-aan tag generator (Genereer tag knop in dit scherm) kunt gebruiken.','A form-tag is a short code enclosed in square brackets used in a form content. A form-tag generally represents an input field, and its components can be separated into four parts: type, name, options, and values. Contact Form 7 supports several types of form-tags including text fields, number fields, date fields, checkboxes, radio buttons, menus, file-uploading fields, CAPTCHAs, and quiz fields.'=>'Een formulier tag is een shortcode, omgeven door vierkante haken, gebruikt in het formulier inhoud. Een formulier tag stelt in het algemeen een invoerveld voor, en de componenten ervan zijn te verdelen in vier onderdelen: type, naam, opties en waarden. Contact Form 7 ondersteunt verschillende soorten formulier tags met inbegrip van tekst velden, numerieke velden, datumvelden, selectievakjes, keuzerondjes, menu\'s, bestand upload velden, CAPTCHA\'s en quiz velden.','Additional Settings provides a place where you can customize the behavior of this contact form by adding code snippets.'=>'Optionele instellingen bieden een plaats waar je het gedrag van dit contactformulier kunt aanpassen door toevoegen van code snippets.','In Messages, you can edit various types of messages used for this contact form. These messages are relatively short messages, like a validation error message you see when you leave a required field blank.'=>'In Berichten kan men verschillende typen berichten bewerken die voor dit contactformulier worden gebruikt. Dit zijn relatief korte berichten, zoals een validatie foutbericht die verschijnt als een vereist veld niet ingevuld is.','Mail (2) is an additional mail template that works similar to Mail. Mail (2) is different in that it is sent only when Mail has been sent successfully.'=>'Mail (2) is een extra mail template dat vergelijkbaar is met Mail. Mail (2) is anders, in die zin dat deze alleen verstuurd wordt bij succesvolle verzending van mail.','Mail manages a mail template (headers and message body) that this contact form will send when users submit it. You can use Contact Form 7’s mail-tags here.'=>'Mail beheert een mail template (headers en bericht body) dat dit contactformulier zal verzenden als gebruikers op \'Verzenden\' klikken. Je kunt hier ook gebruik maken van formulier tags van Contact Form 7.','Form is a content of HTML form. You can use arbitrary HTML, which is allowed inside a form element. You can also use Contact Form 7’s form-tags here.'=>'Formulier is de inhoud van het HTML formulier. Men kan gebruik maken van willekeurige HTML code, voorzover toegestaan binnen een formulier element. Je kunt hier ook gebruik maken van formulier tags van Contact Form 7.','Title is the title of a contact form. This title is only used for labeling a contact form, and can be edited.'=>'Titel is de titel van het contactformulier. Deze titel wordt alleen gebruikt ter identificatie van het contactformulier en kan bewerkt worden.','On this screen, you can edit a contact form. A contact form is comprised of the following components:'=>'In dit scherm kan men een contactformulier bewerken; een contactformulier bestaat uit de volgende componenten:','Duplicate - Clones that contact form. A cloned contact form inherits all content from the original, but has a different ID.'=>'Dupliceren - Kloont het contactformulier. Een gekloond contactformulier neemt alle inhoud over van het origineel, maar heeft een ander ID.','Edit - Navigates to the editing screen for that contact form. You can also reach that screen by clicking on the contact form title.'=>'Bewerken - Stuurt je naar het bewerkingsscherm voor dat contactformulier; je kunt ook naar dat scherm gaan door op de titel van het contactformulier te klikken.','Hovering over a row in the contact forms list will display action links that allow you to manage your contact form. You can perform the following actions:'=>'Als je met de muis over een rij in de contact formulieren lijst gaat worden er actie links getoond die de mogelijkheid geven het contactformulier te beheren; je kunt de volgende acties uitvoeren:','On this screen, you can manage contact forms provided by Contact Form 7. You can manage an unlimited number of contact forms. Each contact form has a unique ID and Contact Form 7 shortcode ([contact-form-7 ...]). To insert a contact form into a post or a text widget, insert the shortcode into the target.'=>'Op dit scherm kun je contactformulieren beheren die door Contact Form 7 worden aangeboden. Je kan een onbeperkt aantal contactformulieren beheren. Elk contactformulier heeft een unieke ID en een Contact Form 7 shortcode ([contact-form-7...]). Om een contactformulier in een bericht of een tekst widget in te voegen, zet je de shortcode in het doel.','Mail-tags'=>'Mail tags','Form-tags'=>'Formulier-tags','Available Actions'=>'Beschikbare acties','Overview'=>'Overzicht','You can add customization code snippets here. For details, see %s.'=>'Hier kun je maatwerk codesnippets toevoegen; voor informatie, zie %s.','https://contactform7.com/additional-settings/'=>'https://contactform7.com/additional-settings/','File attachments'=>'Bestand bijlagen','Use HTML content type'=>'Gebruik HTML content type','Exclude lines with blank mail-tags from output'=>'Sluit regels met lege mail tags uit van de uitvoer','Message body'=>'Bericht inhoud','Additional headers'=>'Extra headers','Subject'=>'Onderwerp','From'=>'Van','To'=>'Aan','In the following fields, you can use these mail-tags:'=>'In de volgende velden kun je deze e-mail tags gebruiken:','Mail (2) is an additional mail template often used as an autoresponder.'=>'Mail (2) is een extra mail template dat vaak gebruikt wordt als een \'autoresponder\'.','Use Mail (2)'=>'Gebruik Mail (2)','Mail (2)'=>'Mail (2)','Y/m/d'=>'j F Y','Edit “%s”'=>'“%s” bewerken','Edit'=>'Bewerken','Date'=>'Datum','Author'=>'Auteur','Shortcode'=>'Shortcode','Title'=>'Titel','Additional Settings'=>'Aanvullende instellingen','Additional Settings (%d)'=>'Aanvullende instellingen (%d)','Messages'=>'Berichten','Mail'=>'Mail','Form'=>'Formulier','Support'=>'Ondersteuning','https://contactform7.com/support/'=>'https://contactform7.com/support/','FAQ'=>'FAQ','https://contactform7.com/faq/'=>'https://contactform7.com/faq/','Docs'=>'Documentatie','https://contactform7.com/docs/'=>'https://contactform7.com/docs/','You are about to delete this contact form. \'Cancel\' to stop, \'OK\' to delete.'=>'Je staat op het punt dit contactformulier te verwijderen. \'Annuleren\' om te stoppen, \'OK\' om te verwijderen.','Delete'=>'Verwijderen','Duplicate'=>'Dupliceren','Status'=>'Status','You can also use this old-style shortcode:'=>'Je kan ook deze oude stijl shortcode gebruiken:','Copy this shortcode and paste it into your post, page, or text widget content:'=>'Kopieer deze shortcode en plak hem in bericht, pagina of widget:','Enter title here'=>'Voer hier de titel in','Save'=>'Opslaan','You are not allowed to edit this contact form.'=>'Je hebt geen toestemming om dit contactformulier te bewerken.','https://contactform7.com/save-submitted-messages-with-flamingo/'=>'https://contactform7.com/save-submitted-messages-with-flamingo/','Spam filtering with Akismet'=>'Spam filteren met Akismet','https://contactform7.com/spam-filtering-with-akismet/'=>'https://contactform7.com/spam-filtering-with-akismet/','Setting up mail'=>'E-mail instellen','https://contactform7.com/setting-up-mail/'=>'https://contactform7.com/setting-up-mail/','https://contactform7.com/donate/'=>'https://contactform7.com/donate/','Contact Form 7 needs your support.'=>'Contact Form 7 heeft je steun nodig.','Dismiss'=>'Negeren','Contact Form 7 %1$s requires WordPress %2$s or higher. Please update WordPress first.'=>'Contact Form 7 %1$s vereist WordPress %2$s of hoger. update WordPress eerst.','Settings'=>'Instellingen','Contact form deleted.'=>'Contactformulier verwijderd.','Contact form saved.'=>'Contactformulier opgeslagen.','Contact form created.'=>'Contactformulier aangemaakt.','Search Contact Forms'=>'Contactformulieren doorzoeken','Search results for “%s”'=>'Zoekresultaten voor “%s”','The changes you made will be lost if you navigate away from this page.'=>'De wijzigingen zullen verloren gaan als je deze pagina verlaat.','Error in deleting.'=>'Fout bij het verwijderen.','You are not allowed to delete this item.'=>'Je hebt geen toestemming om dit item te verwijderen.','You are not allowed to edit this item.'=>'Je hebt geen toestemming om dit item te bewerken.','Integration'=>'Integratie','Add New'=>'Nieuwe toevoegen','Add New Contact Form'=>'Contactformulier toevoegen','Contact Forms'=>'Contactformulieren','Edit Contact Form'=>'Contactformulier bewerken','Contact'=>'Contact','Contact Form 7'=>'Contact Form 7']]; unesco – Nos Dushi Bida